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.)

questionAnswers(1)

yourAnswerToTheQuestion