La comprobación del concepto TS ignora el modificador de acceso privado

10

Quiero escribir un concepto indexable, lo que significa que una secuencia tiene inicio / fin que devuelve RandomAccessIterator o que el operador [] está definido y devuelve un valor de tipo no vacío.

Usé ideas del artículo de Stroustrup para el concepto de secuencia y lo aumenté con:

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

Funciona en la mayoría de los casos, pero falla en lo siguiente:

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

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

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

Por alguna razón, mi concepto ignora el hecho de que el operador [] se define privado y devuelve verdadero. ¿Qué me estoy perdiendo?

magom001
fuente
1
Por interés, ¿cómo usaría su Indexableconcepto en la práctica? Ya que no garantiza un uniforme interfaz del código de usarlo seguiría siendo necesario el envío de forma estática sobre la existencia de cualquiera begin(x)[i]o x[i].
Konrad Rudolph
Es una tarea académica sin ninguna aplicación práctica.
magom001
1
Parece no intencionado: "La verificación de acceso se realiza como parte del proceso de sustitución" eel.is/c++draft/temp#deduct-8.note-1
LF
Qué compilador estas usando? El tronco de GCC parece funcionar bien godbolt.org/z/hY6UvY Los static_assertpases para privado operator[]y fallan para público.
sebrockm
concept boolindica que está compilando contra los conceptos TS, no los conceptos C ++ 20. Las reglas entre los dos pueden ser diferentes.
nogal

Respuestas: