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?
c++
c++-concepts
magom001
sumber
sumber
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]
.static_assert
untuk pribadioperator[]
dan gagal untuk umum.concept bool
menunjukkan bahwa Anda mengkompilasi terhadap Konsep TS, bukan konsep C ++ 20. Aturan antara keduanya mungkin berbeda.Jawaban:
Ini adalah bug GCC # 67225 "Kendala ekspresi dengan hasil terbatas mematikan pemeriksaan akses" , yang akan diperbaiki di GCC10.
sumber