¿Hay alguna forma de deshabilitar la declaración automática para tipos no regulares?

ACTUALIZACIÓN: Hay una propuesta para cambiar el significado deauto en determinadas situaciones.

Evaluación implícita de variables y argumentos "automáticos" por Joel Falcou y otros.

La evaluación implícita deberá:

Habilite los implementadores de clase para indicar que los objetos de esta clase se evalúan en una declaración automática;Habilítelos para determinar el tipo del objeto evaluado;

...

C ++ 11'sauto La palabra clave es genial.

Sin embargo, en mi opinión, si un tipo esIrregular (ver por ejemplo,¿Qué es un "tipo regular" en el contexto de la semántica de movimiento?) el uso deauto se vuelve complicado.

¿Hay alguna manera de deshabilitar elauto declaración para tal tipo?

Supongamos que uno tiene unref clase que emula una referencia

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

(en la vida real sería una clase más complicada, el punto importante es que la clase en cuestión no es regular).

La unica manera que encontreauto r = rd no funcionar (dar un error de compilación) es hacer que la clase no se pueda copiar, sin embargo, necesito que la clase tenga un constructor de copia (con una semántica especial, pero todavía un constructor de copia).

¿Hay alguna manera de deshabilitar una sintaxis?auto r = rd ¿de alguna manera? cuandodecltype(rd) No es regular.

(Aún mejor podría ser de alguna manera decirle al compilador quéauto debe hacer con precisión).

Nota: Este no es un problema muy artificial, uno podría ver que este tipo de problema está en el centro destd::vector<bool>::reference (que también es un contenedor de referencia). Deshabilitar (de alguna manera) la sintaxisauto b = v[10] no resolvería el problema destd::vector<bool> pero dificultará el mal uso.

¿Me estoy perdiendo de algo? ¿Debo cambiar alguna otra parte del diseño? Si las clases no regulares tienen un rasgo de tipo que ayudaría al compilador a determinar un auto más general (por ejemplo, deducirbool paraauto b = v[10] dóndestd::vector<bool> v.)

Respuestas a la pregunta(1)

Su respuesta a la pregunta