Concept TS check ignora il modificatore di accesso privato


10

Voglio scrivere un concetto indicizzabile nel senso che una sequenza ha inizio / fine che restituiscono RandomAccessIterator o l'operatore [] è definito e restituisce un valore di tipo non vuoto.

Ho usato le idee dall'articolo di Stroustrup per il concetto di sequenza e l'ho aumentato con:

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

Funziona sulla maggior parte dei casi ma non riesce su quanto segue:

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

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

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

Per qualche ragione il mio concetto ignora il fatto che l'operatore [] è definito privato e restituisce vero. Cosa mi sto perdendo?


1
Fuori di interesse, come è possibile utilizzare il vostro Indexableconcetto nella pratica? Dal momento che non garantisce un'interfaccia uniforme il codice che utilizza dovrebbe comunque inviare staticamente sull'esistenza di uno begin(x)[i]o x[i].
Konrad Rudolph,

È un incarico accademico senza alcuna applicazione pratica.
magom001,

1
Sembra non previsto: "Il controllo degli accessi viene eseguito come parte del processo di sostituzione" eel.is/c++draft/temp#deduct-8.note-1
LF

Che compilatore stai usando? Il trunk GCC sembra funzionare bene godbolt.org/z/hY6UvY I static_assertpassaggi per il privato operator[]e il fallimento per il pubblico.
sebrockm,

concept boolindica che si sta eseguendo la compilazione in base ai concetti TS, non ai concetti C ++ 20. Le regole tra i due potrebbero essere diverse.
noce,

Risposte:


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.