Sprawdzanie koncepcji TS ignoruje modyfikator dostępu prywatnego

10

Chcę napisać pojęcie Indeksowalne, co oznacza, że ​​sekwencja ma początek / koniec, który zwraca RandomAccessIterator, lub operator [] jest zdefiniowany i zwraca wartość typu nieważnego.

Wykorzystałem pomysły z artykułu Stroustrupa dotyczące koncepcji Sekwencji i rozszerzyłem je o:

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

Działa w większości przypadków, ale nie działa w następujących przypadkach:

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

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

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

Z jakiegoś powodu moja koncepcja ignoruje fakt, że operator [] jest zdefiniowany jako prywatny i zwraca true. czego mi brakuje?

magom001
źródło
1
Jak możesz wykorzystać swoją Indexablekoncepcję w praktyce? Ponieważ nie gwarantuje jednolitego interfejsu, kod, który go użyje, nadal musiałby statycznie wysyłać informacje o istnieniu jednego begin(x)[i]lub x[i].
Konrad Rudolph
Jest to zadanie akademickie bez praktycznych zastosowań.
magom001
1
Nie wydaje się zamierzone: „Kontrola dostępu odbywa się w ramach procesu zastępowania” eel.is/c++draft/temp#deduct-8.note-1
LF
Z jakiego kompilatora korzystasz? Wygląda na to, że łącze GCC działa dobrze godbolt.org/z/hY6UvY . static_assertPrzechodzi na prywatny, operator[]a nie publiczny.
sebrockm
concept boolwskazuje, że kompilujesz w oparciu o TS Concepts, a nie C ++ 20. Zasady między nimi mogą być różne.
orzech

Odpowiedzi: