C ++ 11 introduit {}-escrocux. Mais sont ces deux formes identique? P> p>
3 Réponses :
Ils ne sont pas exactement les mêmes. Peut-être que cela peut être illustré par un contre-exemple: 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 Cela affecterait certains types écrits à la suite de la philosophie "explicite partout" (permettant aux personnes des constructeurs multi-paramètres FOO (int, int, int) code>. J'ai choisi le
initialiszizer_list
Explicit code> en code C ++ 03, même s'il n'a aucun sens dans cette norme.) p> p>
Une question: je n'ai pas compris pourquoi pouvez-vous simplement dire std :: array
std :: Array
@iavr je ne suis pas sûr de suivre. std :: Array
std :: Array
Désolé, mon erreur. L'exemple doit être std :: array
std :: Array
@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
std :: graphique
@AVR Je ne sais pas si cela est également abordé. Il semble incompatible avoir une taille-zéro std :: graye code> non vide. Mais à moins que la future norme ne dit quelque chose à ce sujet explicitement, tout se passe.
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 Par exemple, P> 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.
[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
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.
la syntaxe em> lorsque vous les utilisez dans un cas, c'est des choses différentes dans le premier cas, nous définissons une structure appelée A code >, et dans le second cas, nous définissons un objet appelé
final code>. p> p>
Autant que je sache, oui