12
votes

Les initialisations sont-elles = {} et {} -Style la même chose en C ++ 11?

C ++ 11 introduit {}-escrocux. Mais sont ces deux formes xxx

identique?


1 commentaires

Autant que je sache, oui


3 Réponses :


13
votes

Ils ne sont pas exactement les mêmes. Peut-être que cela peut être illustré par un contre-exemple: xxx

Donc, la deuxième variante nécessite que le type soit implicitement constructible à partir d'une liste d'initialisation, alors que la première version ne le fait pas. Notez que la même chose s'applique aux constructeurs de la forme FOO (int, int, int) . J'ai choisi le initialiszizer_list comme exemple de manière arbitraire.

Cela affecterait certains types écrits à la suite de la philosophie "explicite partout" (permettant aux personnes des constructeurs multi-paramètres Explicit en code C ++ 03, même s'il n'a aucun sens dans cette norme.)


6 commentaires

Une question: je n'ai pas compris pourquoi pouvez-vous simplement dire std :: array a = {}; (pas une erreur mais peut donner un avertissement) alors que std :: Array A {{}}; est nécessaire. Y a-t-il une autre différence pour les types d'agrégats?


@iavr je ne suis pas sûr de suivre. std :: Array a = {}; et std :: Array A {}; devrait être correct. Quel compilateur utilisez-vous?


Désolé, mon erreur. L'exemple doit être std :: array a = {1, 2}; vs std :: Array b {{1, 2}}; . Dans ces derniers doubles accolades sont nécessaires.


@iavr Cela dépend vraiment de votre compilateur. Je reçois des avertissements dans les deux cas avec Clang 3.4 et aucun avertissement avec GCC 4.8.2. Personnellement, je pense que l'exigence d'accolades supplémentaires n'est pas requise par la norme, mais elle est assez ambiguë à ce sujet. Je pense que cela est corrigé pour C ++ 14. (Ce qui peut être la raison pour laquelle les nouvelles versions de GCC ne sont pas émettrices d'avertissements: je suis à peu près sûr que les anciennes versions utilisées.)


Merci, donc si finalement std :: array b {1, 2}; est valide et fonctionne sur tous les compilateurs, il n'y aura aucune raison pour std :: graphique non vide, non? Voir Pourquoi STD :: Array pas vide?


@AVR Je ne sais pas si cela est également abordé. Il semble incompatible avoir une taille-zéro std :: graye non vide. Mais à moins que la future norme ne dit quelque chose à ce sujet explicitement, tout se passe.



5
votes

En plus de la différence expliquée dans la «Juanchopanza» de Juanchopanza's Réponse , il y a une autre différence, un changement de rupture, entre Liste directe-initialisation em> et copie-list-initialisation-initialisation em> En ce qui concerne auto code> et tapez déduction de la bracée-init-list em >. Bien que ce soit non ajouté dans le cadre de C ++ 14 (dernier élément Q & A), La question a été identifiée et il appartient au comité lorsqu'il sera mis en œuvre.

Par exemple, P>

[x{5}](){};        // x is int
[x{1,2}](){};      // ill-formed, no multiple initializers with direct-init
[x = {5}](){};     // ok, x is an initializer_list<int> with one element
[x = {1,2}](){};   // ok, x is an initializer_list<int> with two elements


2 commentaires

Cela n'a pas été voté pour C ++ 14. Voir la dernière paire Q & A à la fin du papier.


@Jamesmcnellis Merci, j'ai supposé que cela avait été quand il y avait montré avec les autres papiers pour C ++ 14. Fixer la réponse.



1
votes

la syntaxe lorsque vous les utilisez dans un cas, c'est des choses différentes xxx

dans le premier cas, nous définissons une structure appelée A , et dans le second cas, nous définissons un objet appelé final .


0 commentaires