Existe uma maneira de desativar a declaração automática para tipos não regulares?
UPDATE: Existe uma proposta para alterar o significado deauto
em certas situações.
Avaliação implícita de variáveis e argumentos “auto” por Joel Falcou e outros.
A avaliação implícita deve:
Habilite os implementadores de classe para indicar que os objetos dessa classe são avaliados em uma instrução automática;Habilite-os para determinar o tipo do objeto avaliado;...
C ++ 11auto
palavra-chave é ótima.
No entanto, na minha opinião, se um tipo éNão Regular (veja, por exemplo,O que é um "Tipo Regular" no contexto da semântica de movimentação?) o uso deauto
torna-se complicado.
Existe uma maneira de desativar oauto
declaração para esse tipo?
Suponha que alguém tenha umref
classe que emula uma referência
double 5.;
ref<double> rd = d; // `ref` behaves like a reference, so it is not a regular type
ref<double> rd2 = rd; // `ref` can be (syntactically) copy constructible, (it is not regular for other reason)
auto r = rd; // now r is not `double`, but EVEN WORST it is `ref<double>`.
(na vida real, seria uma aula mais complicada, o ponto importante é que a aula em questão não é regular.)
A única maneira que encontreiauto r = rd
não funcionar (dê um erro de compilação) é tornar a classe não copiável, no entanto, preciso que a classe tenha um construtor de cópias (com uma semântica especial, mas um construtor de cópias ainda).
Existe uma maneira de desativar uma sintaxeauto r = rd
de alguma forma? quandodecltype(rd)
não é regular.
(Melhor ainda é poder dizer ao compilador o queauto
deve fazer com precisão).
Nota: Este não é um problema muito artificial, pode-se ver que esse tipo de problema está no centro destd::vector<bool>::reference
(que também é um wrapper de referência). Desabilitando (de alguma forma) a sintaxeauto b = v[10]
não resolveria o problema destd::vector<bool>
mas dificultará o mau uso.
Estou esquecendo de algo? Devo mudar alguma outra parte do design? As classes não regulares devem ter uma característica de tipo que ajudaria o compilador a determinar um auto mais geral (por exemplo, deduzirbool
paraauto b = v[10]
Ondestd::vector<bool> v
.)