Qual é a regra que permite que `this->` acesse membros de classes base dependentes?
Como sabemos, o código abaixo está mal formado porque o membrox
está em uma classe base dependente. Entretanto, mudarx
parathis->x
na linha indicada corrigiria o erro.
template <typename T>
struct B {
int x;
};
template <typename T>
struct C : B<T> {
void f() {
int y = x; // Error!
}
};
int main() {
C<int> c;
c.f();
}
Eu gostaria de uma explicação de como esse comportamento é especificado no padrão. De acordo com [temp.dep] / 3:
Na definição de uma classe ou modelo de classe, se uma classe base depende de umparâmetro-modelo o escopo da classe base não é examinado durante a pesquisa de nome não qualificado no ponto de definição do modelo ou membro da classe ou durante uma instanciação do modelo ou membro da classe.
Isso parece explicar por que usarx
sozinho falha. O nomex
é pesquisado no ponto de definição e o escopo da classe base não é examinado. No entanto, e se usarmosthis->x
? Agora o nomex
é dependente e sua pesquisa é adiada até a instanciação. Mas o parágrafo citado parece implicar quex
não deve ser encontradomesmo no momento da instanciação, desde a pesquisa dex
nothis->x
éainda não qualificado olho para cima.
Obviamente, as implementações não se comportam dessa maneira e é amplamente entendido que o escopo da classe baseé procurado uma vez que o modelo é instanciado.
Interpretei mal o parágrafo citado?Existe um parágrafo que especifique o comportamento "correto"?