ejemplo - C++ 11: declaración de miembros de datos no estáticos como ''auto''
decltype (1)
¿C ++ 11 permite declarar miembros de datos no estáticos como ''auto'' si se inicializan en la declaración? Por ejemplo:
struct S
{
auto x = 5; // in place of ''int x = 5;'', which is definitely allowed
};
GCC 4.7 rechaza el código anterior, mientras acepta int x = 5;
.
Suponiendo que esto no es un error del compilador, sino que el estándar realmente no lo permite, ¿por qué no? Sería tan útil como declarar auto
las variables locales.
La regla para prohibir miembros no estáticos se encuentra en 7.1.6.4 cláusula 4:
El especificador automático de tipo también se puede usar para declarar una variable en la condición de una instrucción de selección (6.4) o una instrucción de iteración (6.5), en el tipo-especificador-seq en la identificación de tipo nuevo o tipo-identificación de una expresión nueva (5.3.4), en una declaración for-range, y en la declaración de un miembro de datos estáticos con un inicializador ortogonal o igual que aparece dentro de la especificación miembro de una definición de clase (9.4.2) .
Encontré la razón por la cual es estático here que refleja cómo James McNellis lo explica en el comentario.
A un organismo nacional no le gusta permitir el especificador de tipo automático para no estáticos. De un correo electrónico a los autores:
template< class T > struct MyType : T { auto data = func(); static const size_t erm = sizeof(data); };
Para determinar el diseño de X, ahora tenemos búsqueda de nombre de dos fases y ADL. Tenga en cuenta que func podría ser un tipo o una función; se puede encontrar en T, el espacio de nombres de MyType, el espacio de nombres asociado de T cuando se crea una instancia, el espacio de nombres global, un espacio de nombres anónimo o cualquier espacio de nombres sujeto a una directiva using. Con cuidado, probablemente podríamos lanzar alguna búsqueda de concept_map para tener suerte. Dependiendo del orden de inclusión del encabezado, es posible que incluso obtenga diferentes resultados para la ADL y rompa la regla de una sola definición, que no es necesario diagnosticar.
Debido a esta controversia, los autores ya no proponen que se permita automáticamente para miembros de datos no estáticos.
Entonces, básicamente dependiendo del orden de inclusión del encabezado, el tipo de data
podría ser muy diferente. Por supuesto, auto x = 5;
no necesitaría depender de la búsqueda de nombre de dos fases o ADL, sin embargo, supongo que lo hicieron una regla "general" porque de lo contrario, tendrían que hacer reglas individuales para cada caso de uso que haría las cosas muy complicadas .
En el mismo documento, el autor propone eliminar esta restricción, sin embargo, parece que esta propuesta ha sido rechazada probablemente debido a la lógica anterior y también por lo que el comportamiento esperado puede ser el mismo sin importar cuál sea el inicializador.