2012-05-16 6 views
8

Código como este puede funcionar bien:¿Cuál es el tipo de lista de inicialización en la matriz C++?

char str[] = {'a', 'b', '\0'}; 

La izquierda es una variable automática (matriz).

código como este puede NO trabajo:

char *str = {'a', 'b', '\0'}; 

El lado izquierdo es un puntero. El puntero apunta a un espacio desconocido, por lo que esto fallará.

Mi pregunta es, ¿cuál es el tipo del lado derecho?

En C++ 11, una lista de inicialización se convierte en std::initializer_list. ¿Pero qué hay del viejo C++ 03?

+1

El RHS no es siempre una 'std :: initializer_list' en C++ 11. – juanchopanza

+0

@juanchopanza ¿Hay documentos breves sobre esto? – liuyanghejerry

+1

Quizás [aquí] (http://en.wikipedia.org/wiki/C%2B%2B11#Initializer_lists) y [aquí] (http://www2.research.att.com/~bs/C++0xFAQ .html # init-list) aunque no es 100% claro. Tuve que esforzarme mucho en el estándar. – juanchopanza

Respuesta

8

En C++ 03, un inicializador incluido en llaves no es más que un dispositivo sintáctico que se puede utilizar para inicializar agregados (como arreglos o ciertos tipos de clases o estructuras). No tiene un 'tipo' y solo se puede usar para esos tipos específicos de inicializadores.

8.5.1/2 "agregados":

Cuando un agregado se inicializa el inicializador puede contener un inicializador-cláusula que consiste en un brace- cerrado, comas separó lista de inicializador-cláusulas para los miembros del agregado, escritos en para aumentar el subíndice o el orden de los miembros.

0

Desde el proyecto de C++ 11:

8,5 Inicializadores

16 La semántica de inicializadores son los siguientes. El tipo de destino es el tipo del objeto o referencia que se inicializa y el tipo de fuente es el tipo de expresión del inicializador. El tipo de origen no es definido cuando el inicializador es una lista de inicio respaldada o cuando es una lista de expresiones entre paréntesis .

+0

Gracias, pero esto no es lo que realmente estoy preguntando. Lo estoy preguntando en C++ 03. – liuyanghejerry

4

En C++ 03 del lado derecho es un inicializador lista. No tiene ningún tipo, solo sirve para proporcionar un medio para inicializar valores para identificadores.

Esto se define en:

C++ 03 8.5.1 Inicializadores [dcl.init]

A declarador puede especificar un valor inicial para el identificador de ser declarado. El identificador designa un objeto o referencia que se inicializa. El proceso de inicialización descrito en el resto de 8.5 se aplica también a las inicializaciones especificadas por otros contextos sintácticos, como la inicialización de parámetros de función con expresiones de argumento (5.2.2) o la inicialización de valores de retorno (6.6.3).

initializer: 
     = initializer-clause 
     (expression-list) 
initializer-clause: 
     assignment-expression 
     { initializer-list ,opt } 
     { } 
initializer-list: 
     initializer-clause 
     initializer-list , initializer-clause 
0
int num [3] = {1,2,3} ; 

int num [0]= 1 ; 
num [1]= 2 ; 
num [2] = 3 ; 
Cuestiones relacionadas