Recentemente, vi um recurso estranho do C ++: nome da classe injetada .
class X { };
X x1;
class X::X x2; // class X::X is equal to X
class X::X::X x3; // ...and so on...
Mas não consigo descobrir por que esse recurso é necessário. Existe alguma prática que requer esse recurso?
E ouvi dizer que esse recurso não existia no C ++ antigo. Então, quando foi introduzido? C ++ 03? C ++ 11?
Respostas:
O nome da classe injetada significa que
X
é declarado como membro deX
, para que a pesquisa de nomeX
sempre encontre a classe atual, e não outraX
que possa ser declarada no mesmo escopo, por exemploA
create()
função está criando umX
objeto temporário ou chamando a funçãoX
? No escopo do espaço para nome, ele chamaria a função; portanto, o objetivo do nome da classe injetado é garantir que, dentro do corpo doX
nome, sempre encontre a própria classe (porque a pesquisa de nome começa no próprio escopo da classe antes de procurar no anexo) escopo).Também é útil dentro de modelos de classe, onde o nome da classe injetada pode ser usado sem uma lista de argumentos de modelo, por exemplo, usando simplesmente em
Foo
vez do ID completo do modeloFoo<blah, blah, blah>
, para facilitar a consulta à instanciação atual. Veja DR 176 para uma alteração entre C ++ 98 e C ++ 03 que esclareceu isso.A idéia do nome da classe injetada estava presente no C ++ 98, mas a terminologia era nova no C ++ 03.
O C ++ 98 diz:
A segunda sentença foi alterada pelo DR 147, então o C ++ 03 diz em [class] / 2:
Mesmo antes do C ++ 98, o ARM possui uma expressão aproximadamente equivalente, o que significa que o nome da classe sempre pode ser usado no corpo da classe para se referir à própria classe:
fonte