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?