Khái niệm TS kiểm tra bỏ qua sửa đổi truy cập cá nhân


10

Tôi muốn viết một khái niệm Có thể lập chỉ mục có nghĩa là một chuỗi có bắt đầu / kết thúc trả về RandomAccessIterator hoặc toán tử [] được xác định và trả về giá trị của loại không rỗng.

Tôi đã sử dụng các ý tưởng từ bài viết của Stroustrup cho khái niệm Sequence và tăng cường nó với:

template <class T>
concept bool Indexable = Sequence<T> || requires(T t, size_t n) {
    { t[n] } -> NotVoid;
};

Nó hoạt động trên hầu hết các trường hợp nhưng không thành công như sau:

struct Bad {
    std::vector<int> nums;

private:
    int& operator[](size_t ind) {
        return nums[ind];
    }
};

static_assert(!Indexable<Bad>, "fail");

Vì một số lý do, khái niệm của tôi bỏ qua thực tế rằng toán tử [] được định nghĩa là riêng tư và trả về true. Tôi đang thiếu gì?


1
Không quan tâm, làm thế nào bạn sẽ sử dụngIndexable khái niệm của bạn trong thực tế? Vì nó không đảm bảo một giao diện thống nhất, mã sử dụng nên vẫn cần gửi tĩnh về sự tồn tại của một trong hai begin(x)[i]hoặc x[i].
Konrad Rudolph

Đây là một nhiệm vụ học tập mà không có bất kỳ ứng dụng thực tế.
magom001

1
Có vẻ như không có ý định: "Kiểm tra truy cập được thực hiện như một phần của quy trình thay thế" eel.is/c++draft/temp#deduct-8.note-1
LF

Trình biên dịch nào bạn đang sử dụng? Thân cây GCC dường như hoạt động tốt godbolt.org/z/hY6UvY Các static_assertđường chuyền cho riêng tư operator[]và thất bại cho công chúng.
sebrockm

concept boolchỉ ra rằng bạn đang biên dịch theo các khái niệm TS, không phải khái niệm C ++ 20. Các quy tắc giữa hai có thể khác nhau.
quả óc chó

Câu trả lời:


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.