Eu quero escrever um conceito Indexável, o que significa que uma sequência tem início / fim que retornam RandomAccessIterator ou operador [] é definido e retorna um valor do tipo não nulo.
Usei idéias do artigo de Stroustrup para o conceito de Sequência e o ampliei com:
template <class T>
concept bool Indexable = Sequence<T> || requires(T t, size_t n) {
{ t[n] } -> NotVoid;
};
Funciona na maioria dos casos, mas falha no seguinte:
struct Bad {
std::vector<int> nums;
private:
int& operator[](size_t ind) {
return nums[ind];
}
};
static_assert(!Indexable<Bad>, "fail");
Por alguma razão, meu conceito ignora o fato de que o operador [] é definido como privado e retorna verdadeiro. o que estou perdendo?
c++
c++-concepts
magom001
fonte
fonte
Indexable
conceito na prática? Como não garante uma interface uniforme, o código usado ainda precisará ser enviado estaticamente sobre a existência de umbegin(x)[i]
ou outrox[i]
.static_assert
passes são privadosoperator[]
e os públicos.concept bool
indica que você está compilando com os conceitos de conceitos de TS, não de C ++ 20. As regras entre os dois podem ser diferentes.Respostas:
Esse é o bug do GCC # 67225 "A restrição de expressão com um resultado restrito desativa a verificação de acesso" , que será corrigida no GCC10.
fonte