Cek konsep TS mengabaikan pengubah akses pribadi

10

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?

magom001
sumber
1
Karena minat, bagaimana Anda menggunakanIndexable konsep Anda dalam praktik? Karena tidak menjamin antarmuka yang seragam, kode yang menggunakannya masih perlu mengirimkan secara statis keberadaan salah satu begin(x)[i]atau x[i].
Konrad Rudolph
Ini adalah tugas akademis tanpa aplikasi praktis.
magom001
1
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 static_assertuntuk pribadi operator[]dan gagal untuk umum.
sebrockm
concept boolmenunjukkan bahwa Anda mengkompilasi terhadap Konsep TS, bukan konsep C ++ 20. Aturan antara keduanya mungkin berbeda.
walnut

Jawaban: