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ì?
Đâ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
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
—
sebrockm
static_assert
đường chuyền cho riêng tư operator[]
và thất bại cho công chúng.
concept bool
chỉ 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.
Indexable
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 haibegin(x)[i]
hoặcx[i]
.