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?
É um trabalho acadêmico sem aplicações práticas.
—
magom001 25/02
Parece não pretendido: "A verificação de acesso é feita como parte do processo de substituição" eel.is/c++draft/temp#deduct-8.note-1
—
LF
Qual compilador você está usando? O tronco do GCC parece funcionar bem godbolt.org/z/hY6UvY Os
—
sebrockm 25/02
static_assert
passes são privados operator[]
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.
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]
.