2017-08-07 2 views
1

Dans un 14 standard C++ draft, il y a deux mentions (que je trouve) en ce qui concerne l'initialisation du tableau:C++ tableau initialiseur

  1. Section 8.5.1 ([dcl.init.aggr]) du paragraphe 2:

"Quand un agrégat est initialisé par une liste d'initialisation [...]"

  1. Section 8.5. 2 ([dcl.init.string]) le paragraphe 1:

« Un tableau de type de caractère étroit (3.9.1), un tableau char16_t, tableau char32_t ou le tableau wchar_t peut être initialisé par un étroit respectivement, littéral de chaîne, char16_t littéral de chaîne, char32_t littéral de chaîne, ou chaîne littérale large, respectivement, ou par un littéral de chaîne correctement typé entouré d'accolades (2.13.5). [...] »

Par conséquent, il y a au moins deux types de initializers qui peuvent être utilisés pour les tableaux:. Listes et chaînes littérales

initialiseur

Est-ce que la mention norme explicitement que ce sont les que deux options?

+0

Non, car les tableaux peuvent également être initialisés par défaut et par valeur. –

+0

Ma formulation a pu être mauvaise. Je faisais référence à d'autres types d'initialiseurs (non vides) qui peuvent être utilisés pour initialiser des tableaux. – user42768

Répondre

1

Paragraph 17 de [dcl.init] tous les initialiseurs possibles spécifie pour les tableaux.

17 Le la sémantique des initialiseurs est la suivante. Le type de destination est le type de l'objet ou de la référence en cours d'initialisation et le type de la source est le type de l'expression de l'initialiseur. Si l'initialiseur n'est pas une expression unique (éventuellement parenthésée), le type de source n'est pas défini.

(17.1) Si l'initialiseur est un (non-parenthèses) -init-liste contreventé ou est = -init-liste embase, l'objet ou de référence est initialisé liste.

(17.2) Si le type de destination est un type de référence, voir [dcl.init.ref]. Si le type de destination est un tableau de caractères, un tableau de char16_t, un tableau de char32_t ou un tableau de wchar_t, et l'initialiseur est un littéral de chaîne, voir [dcl.init.string].

(17.4) Si l'initialiseur est(), l'objet est initialisé en valeur.

(17.5)Sinon, si le type de destination est un tableau, le programme est mal formé.

(17.2) ne sont pas applicables aux tableaux, donc les options sont:

  1. Default-initialisation ([dcl.init]/12): int x[3];
  2. Value-initialisation ([dcl.init]/17.4): int* x = new int[3]();
  3. Liste-initialisation ([dcl.init]/17.1): int x[] = {1, 2, 3}; ou int x[] {1, 2, 3};
  4. Initialisation avec un littéral chaîne ([dcl.init]/17.3): char x[] = "text";