A verificação de conceito TS ignora o modificador de acesso privado

10

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?

magom001
fonte
11
Fora de interesse, como você usaria seu Indexableconceito na prática? Como não garante uma interface uniforme, o código usado ainda precisará ser enviado estaticamente sobre a existência de um begin(x)[i]ou outro x[i].
Konrad Rudolph
É um trabalho acadêmico sem aplicações práticas.
magom001 25/02
11
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 static_assertpasses são privados operator[]e os públicos.
sebrockm 25/02
concept boolindica que você está compilando com os conceitos de conceitos de TS, não de C ++ 20. As regras entre os dois podem ser diferentes.
noz

Respostas: