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?
c++
c++-concepts
magom001
fuente
fuente
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]
.static_assert
pases para privadooperator[]
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.Respuestas:
Este es el error GCC # 67225 "La restricción de expresión con un resultado restringido desactiva la comprobación de acceso" , que se solucionará en GCC10.
fuente