Valorar inicializar un objeto de tipo T
, se podría hacer algo en la línea de una de las siguientes:conversión explícita y múltiples especificadores de tipo simple
T x = T();
T x((T()));
Mi pregunta se refiere a los tipos especificados por una combinación de simples especificadores de tipo, por ejemplo, unsigned int
:
unsigned int x = unsigned int();
unsigned int x((unsigned int()));
Visual C++ 2008 y compilador Intel C++ 11.1 aceptar tanto de ellos sin advertencias; Comeau 4.3.10.1b2 y g ++ 3.4.5 (que, es cierto, no es particularmente reciente) no.
Según el estándar de la C++ (C++ 03 5.2.3/2, expr.type.conv):
La expresión
T()
, dondeT
es un simple de tipo-especificador (7.1.5.2) para un no-array tipo de objeto completo o el (posiblemente cv-cualificada)void
tipo, crea un rvalue del tipo especificado, que es de valor inicializado
7.1.5.2 dice, "los simples especificadores tipo son , "y sigue con una lista que incluye unsigned
y int
.
Por lo tanto, dado que en 5.2.3/2 "de tipo simple especificador" es singular, y unsigned
y int
son dos especificadores de tipo, son los ejemplos anteriores que el uso unsigned int
no válida? (y, de ser así, el seguimiento es, ¿es incorrecto que Microsoft e Intel admitan dichas expresiones?)
Esta pregunta es más por curiosidad que otra cosa; para todos los tipos especificados por una combinación de múltiples especificadores de tipo simple, la inicialización del valor es equivalente a la inicialización cero. (Esta pregunta fue solicitada por comments in response to this answer to a question about initialization).
¿Cómo te atreves a preguntarme? : 3 Creo que la expresión '(unsigned int)' nombra un tipo, sin embargo. – GManNickG
@GMan: '(unsigned int)()' falla con gcc 3 y 4 y también con VC8. Las versiones 'typedef'ed funcionan, por supuesto. –
H m. :( – GManNickG