47 votes

Brace elision in std::array initialization

Supposons qu'il y a un std::array d'être initialisé. C'est pas grave si à l'aide d'accolades doubles:

std::array<int, 2> x = {{0, 1}};
std::array<int, 2> x{{0, 1}};

Il est également possible d'utiliser un seul appareil dans le bon vieux globale de l'initialisation, comme le corset élision prendra soin de le manque des accolades:

std::array<int, 2> x = {0, 1};

Cependant, est-il acceptable d'utiliser la liste d'initialisation avec un seul appareil? GCC accepte, Clang rejette avec "ne peut pas omettre les accolades autour de l'initialisation du sous-objet lors de l'utilisation directe de la liste d'initialisation".

std::array<int, 2> x{0, 1};

La seule partie de la norme qui accolade élision est mentionné 8.5.1/12, qui dit:

Toutes les conversions de type implicites (Clause 4) sont pris en considération lors de l'initialisation de la somme membre à une mission d'expression. Si la cession-expression peut initialiser un membre, le membre est initialisé. Sinon, si le membre est lui-même un subaggregate, brace élision est supposé et la mission-l'expression est prise en compte pour l'initialisation du premier membre de la subaggregate.

8.5.1 est d'environ globale de l'initialisation spécifiquement, de sorte que devrait signifier Clang est bon de le rejeter, non? Pas si vite. 8.5.4/3 dit:

Liste d'initialisation d'un objet ou d'une référence de type T est défini comme suit:

[...]

- Sinon, si T est un agrégat, agrégée d'initialisation est effectuée (8.5.1).

Je pense que cela veut dire que exactement les mêmes règles que les agrégats d'initialisation, y compris corset élision, d'appliquer, de sens de GCC est correct d'accepter.

Je l'avoue, le libellé n'est pas particulièrement clair. Ainsi, le compilateur est juste dans son traitement de la troisième extrait? Le corset élision se produire dans la liste d'initialisation, ou il ne l'est pas?

22voto

Johannes Schaub - litb Points 256113

L'élision des accolades s'applique, mais pas en C ++ 11. En C ++ 14, ils appliqueront à cause de http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1270 . Si vous avez de la chance, Clang rétribuera son jeu en mode C ++ 11 (espérons-le!).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X