Saya ingin menulis konsep yang dapat diindeks makna bahwa urutan telah memulai / mengakhiri yang mengembalikan RandomAccessIterator, atau operator [] didefinisikan dan mengembalikan nilai dari tipe yang tidak kosong.
Saya menggunakan ide-ide dari artikel Stroustrup untuk konsep Sequence dan menambahkannya dengan:
template <class T>
concept bool Indexable = Sequence<T> || requires(T t, size_t n) {
{ t[n] } -> NotVoid;
};
Ini bekerja pada kebanyakan kasus tetapi gagal pada yang berikut:
struct Bad {
std::vector<int> nums;
private:
int& operator[](size_t ind) {
return nums[ind];
}
};
static_assert(!Indexable<Bad>, "fail");
Untuk beberapa alasan konsep saya mengabaikan fakta bahwa operator [] didefinisikan pribadi dan mengembalikan true. Apa yang saya lewatkan?
Ini adalah tugas akademis tanpa aplikasi praktis.
—
magom001
Tampaknya tidak dimaksudkan: "Pemeriksaan akses dilakukan sebagai bagian dari proses substitusi" eel.is/c++draft/temp#deduct-8.note-1
—
LF
Kompiler apa yang Anda gunakan? Bagasi GCC tampaknya berfungsi dengan baik godbolt.org/z/hY6UvY Kartu akses
—
sebrockm
static_assert
untuk pribadi operator[]
dan gagal untuk umum.
concept bool
menunjukkan bahwa Anda mengkompilasi terhadap Konsep TS, bukan konsep C ++ 20. Aturan antara keduanya mungkin berbeda.
Indexable
konsep Anda dalam praktik? Karena tidak menjamin antarmuka yang seragam, kode yang menggunakannya masih perlu mengirimkan secara statis keberadaan salah satubegin(x)[i]
ataux[i]
.