2010-01-27 14 views
8

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(), donde T 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).

+0

¿Cómo te atreves a preguntarme? : 3 Creo que la expresión '(unsigned int)' nombra un tipo, sin embargo. – GManNickG

+0

@GMan: '(unsigned int)()' falla con gcc 3 y 4 y también con VC8. Las versiones 'typedef'ed funcionan, por supuesto. –

+0

H m. :( – GManNickG

Respuesta

8

I posted this question to comp.lang.c++.moderated.

Daniel Krugler del comité de estándares de C++ de acuerdo con la interpretación de que unsigned int es una combinación de especificadores de tipo simple, y no es en sí mismo un simple especificador de tipo.

En cuanto a la leyenda de la Tabla 7 referenced by Jerry Coffin, Krugler dice:

Estoy de acuerdo que la cabecera de la Tabla 7 (que es la Tabla 9 en el reciente proyecto más N3000) es algo engañoso, pero el precedente texto en [dcl.type.simple]/2 se ve muy claro para mí, cuando dice:.

Tabla 7 resume las combinaciones válidas de simples de tipo especificadores y los tipos que se especifican"

(Pido disculpas, tardé tanto en publicar esto aquí desde el grupo de noticias; me olvidó por completo)

1

Hmm, a veces necesitas un typedef. Si no dice que se requiere un diagnóstico, no es incorrecto que lo respalde. Sin embargo, para la portabilidad, puede utilizar un typedef (uint16_t o uint64_t, aunque los que podría no ser adecuado), o cita el nombre de tipo con una plantilla:

iterator<void, unsigned long>::value_type(5) 

Cómo es eso de irrazonablemente detallado?

Editar: Duh, o simplemente 5ul. Eso deja unsigned short, unsigned char y signed char como los únicos tipos que no se pueden construir explícitamente fácilmente.

+0

Prefiero tener: 'template struct same_type {typedef T type;};', un poco más fácil. – GManNickG

+0

Prefiero no tener ninguno; v). Solo traté de pensar en algo en el STL. La omisión de una plantilla de identidad y un functor de identidad siempre me desconcertaba. – Potatoswatter

+0

Tiene razón sobre el problema de corrección. "Una implementación conforme puede tener extensiones ... siempre que no alteren el comportamiento de cualquier programa bien formado" (1.4/8, intro.compliance); Olvidé exactamente cuáles eran las reglas sobre la gramática del lenguaje, las extensiones y el cumplimiento. –

1

En §7.1.5.2, siga leyendo en la tabla 7, que tiene la lista completa de lo que está permitido como un simple especificador (que incluye "unsigned int").

+3

Yo diría que el la tabla no pretende definir la noción de "especificador de tipo simple". Además, la redacción después de la tabla menciona "múltiples especificadores de tipos simples". Esta es la redacción que nos permite usar 'unsigned int' y' int unsigned' indistintamente, lo que probablemente signifique que 'unsigned int' es de hecho * múltiples * tipos simples de especificadores. – AnT

+0

@AndreyT: Esa fue mi interpretación también. También creo que el encabezado de la columna de la tabla, "Especificador (es)" implica tanto. –

+0

Hmm ... en mi copia del estándar, el título de la tabla es "Especificadores de tipo simple y los tipos que especifican". Con ese título, parece un tramo terrible creer que algo en la tabla * no * es un simple especificador de tipo. –

-2

7.1.5.2:

Los de tipo sencillo especificadores especificar ya sea un tipo definido por el usuario previamente declaradas o uno de los types` fundamental

Esto implica que unsigned int i = unsigned int() es legal, desde unsigned int es un tipo fundamental (y por lo tanto simple-type-specifier, ver 3.9.1).

mismo se aplica a tipos como:

long double 
long long 
long long int 
unsigned long 
unsigned long long int 
short int 
... 
+0

Creo que aquí hay una falacia lógica: su argumento es que, "si T es un simple especificador de tipo, entonces T es un tipo definido previamente por el usuario o T es uno de los tipos fundamentales. T es un tipo fundamental, por lo tanto, T es un simple especificador de tipo "(usted está afirmando el consecuente). –

+0

@James: No entiendo lo que está diciendo, su pregunta indicó que 'T t = T()' es legal para especificadores de tipo simple, y mi cita dice que los tipos fundamentales SON especificadores de tipo simple, por lo tanto 'unsigned int i = unsigned int() 'es legal. – smerlin

+1

Me disculpo; Claramente, no había tenido suficiente café cuando publiqué eso esta mañana. No estoy de acuerdo con su interpretación de que si 'T' es un tipo fundamental,' T' también debe ser un simple especificador de tipo. Creo que 'T' puede ser, de hecho, múltiples especificadores de tipo simple (por ejemplo,' unsigned int' es un tipo fundamental, pero está designado por dos simples especificadores de tipo, 'unsigned' y' int'). Creo que hay muchas declaraciones para apoyar esto, p. 3.9.1, nota 40: "Véase 7.1.5.2 con respecto a la correspondencia entre los tipos y las _secuencias_ de los tipos-especificadores que los designan" (el énfasis es mío) –

Cuestiones relacionadas