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?
Es una tarea académica sin ninguna aplicación práctica.
—
magom001
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
—
sebrockm
static_assert
pases para privado operator[]
y fallan para público.
concept bool
indica que está compilando contra los conceptos TS, no los conceptos C ++ 20. Las reglas entre los dos pueden ser diferentes.
Indexable
concepto 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 cualquierabegin(x)[i]
ox[i]
.