Die Konzept-TS-Prüfung ignoriert den Modifikator für den privaten Zugriff

10

Ich möchte ein Konzept Indexable schreiben, das bedeutet, dass eine Sequenz entweder Anfang / Ende hat, die RandomAccessIterator zurückgibt, oder operator [] definiert ist und einen Wert vom Typ nicht void zurückgibt.

Ich habe Ideen aus Stroustrups Artikel für das Sequenzkonzept verwendet und es erweitert mit:

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

Es funktioniert in den meisten Fällen, schlägt jedoch in folgenden Fällen fehl:

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

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

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

Aus irgendeinem Grund ignoriert mein Konzept die Tatsache, dass operator [] privat definiert ist und true zurückgibt. Was vermisse ich?

magom001
quelle
1
Aus Interesse, wie würden Sie nutzen Ihr IndexableKonzept in der Praxis? Da dies keine einheitliche Schnittstelle garantiert, müsste der verwendete Code bei Vorhandensein von entweder begin(x)[i]oder noch statisch versendet werden x[i].
Konrad Rudolph
Es ist eine akademische Aufgabe ohne praktische Anwendung.
magom001
1
Scheint nicht beabsichtigt: "Die Zugriffsprüfung erfolgt im Rahmen des Substitutionsprozesses" eel.is/c++draft/temp#deduct-8.note-1
LF
Welchen Compiler verwenden Sie? GCC-Trunk scheint gut zu funktionieren godbolt.org/z/hY6UvY Die static_assertPässe für privat operator[]und scheitern für öffentlich.
sebrockm
concept boolGibt an, dass Sie mit den Konzepten TS kompilieren, nicht mit C ++ 20-Konzepten. Die Regeln zwischen den beiden können unterschiedlich sein.
Walnuss

Antworten: