class C
{
public:
C() : arr({1,2,3}) //doesn't compile
{}
/*
C() : arr{1,2,3} //doesn't compile either
{}
*/
private:
int arr[3];
};
Je pense que la raison en est que les tableaux ne peuvent être initialisés qu'avec la =
syntaxe, c'est-à-dire:
int arr[3] = {1,3,4};
Des questions
- Comment puis-je faire ce que je veux faire (c'est-à-dire initialiser un tableau dans un constructeur (sans affecter des éléments dans le corps)). Est-ce même possible?
- La norme C ++ 03 dit-elle quelque chose de spécial sur l'initialisation des agrégats (y compris les tableaux) dans les initialiseurs ctor? Ou l'invalidité du code ci-dessus est un corollaire de certaines autres règles?
- Les listes d'initialiseurs C ++ 0x résolvent-elles le problème?
PS Veuillez ne pas mentionner les vecteurs, boost :: arrays et leur supériorité par rapport aux tableaux, dont je suis bien conscient.
c++
c++11
initializer-list
ctor-initializer
aggregate-initialization
Armen Tsirunyan
la source
la source
Réponses:
Oui. Il utilise une structure qui contient un tableau. Vous dites que vous le savez déjà, mais je ne comprends pas la question. De cette façon, vous faites initialiser un tableau dans le constructeur, sans affectations dans le corps. C'est ce que
boost::array
fait.Un mem-initializer utilise l'initialisation directe. Et les règles de l'article 8 interdisent ce genre de chose. Je ne suis pas vraiment sûr du cas suivant, mais certains compilateurs le permettent.
Voir ce PR GCC pour plus de détails.
Oui, ils le font. Cependant, votre syntaxe est invalide, je pense. Vous devez utiliser des accolades directement pour déclencher l'initialisation de la liste
la source
char * const foo[6];
membre de la classe. Il nécessite que l'initialiseur compile en C ++ 11.C ++ 98 ne fournit pas de syntaxe directe pour autre chose que la mise à zéro (ou pour les éléments non POD, l'initialisation de la valeur) du tableau. Pour cela, vous écrivez simplement
C(): arr() {}
.Je pense que Roger Pate se trompe sur les prétendues limitations de l'initialisation d'agrégat C ++ 0x, mais je suis trop paresseux pour le rechercher ou le vérifier, et cela n'a pas d'importance, n'est-ce pas? EDIT : Roger parlait de "C ++ 03", je l'ai mal interprété comme "C ++ 0x". Désolé, Roger. ☺
Une solution de contournement C ++ 98 pour votre code actuel consiste à encapsuler le tableau dans un
struct
et à l'initialiser à partir d'une constante statique de ce type. Les données doivent de toute façon résider quelque part. De la manchette, cela peut ressembler à ceci:la source
Solution de contournement:
la source
En C ++ 03, l'initialisation d'agrégat s'applique uniquement avec une syntaxe similaire à celle ci-dessous, qui doit être une instruction distincte et ne rentre pas dans un initialiseur ctor.
la source
Que diriez-vous
?
Compile bien sur g ++ 4.8
la source
Vous voulez initier un tableau d'entiers dans votre constructeur? Faites-le pointer vers un tableau statique.
la source