Klammerelision bei der Initialisierung von std :: array

Angenommen, es gibt einestd::array initialisiert werden. Es ist in Ordnung, wenn Sie doppelte Klammern verwenden:

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

Es ist auch in Ordnung, einzelne geschweifte Klammern in der guten alten Aggregatinitialisierung zu verwenden, da die geschweifte Klammer die fehlenden geschweiften Klammern beseitigt:

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

Ist es jedoch in Ordnung, die Listeninitialisierung mit einzelnen geschweiften Klammern zu verwenden? GCC akzeptiert es, Clang lehnt es mit "Klammern um die Initialisierung des Unterobjekts bei Verwendung der direkten Listeninitialisierung dürfen nicht weggelassen werden" ab.

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

Der einzige Teil des Standards, in dem Klammerentfernung erwähnt wird, ist 8.5.1 / 12, der besagt:

Alle impliziten Typkonvertierungen (Klausel 4) werden berücksichtigt, wenn das Aggregatelement mit einem Zuweisungsausdruck initialisiert wird. Wenn der Zuweisungsausdruck ein Mitglied initialisieren kann, wird das Mitglied initialisiert. Andernfalls, wenn das Mitglied selbst ein Unteraggregat ist, wird die Klammerentscheidung angenommen und der Zuweisungsausdruck wird für die Initialisierung des ersten Mitglieds des Unteraggregats berücksichtigt.

8.5.1 befasst sich speziell mit der Aggregatinitialisierung, was bedeuten sollte, dass Clang richtig ist, um abzulehnen, oder? Nicht so schnell. 8.5.4 / 3 sagt:

Die Listeninitialisierung eines Objekts oder einer Referenz vom Typ T ist wie folgt definiert:

[…]

- Andernfalls wird, wenn T ein Aggregat ist, eine Aggregatinitialisierung durchgeführt (8.5.1).

Ich denke, das bedeutet, dass genau die gleichen Regeln wie bei der Gesamtinitialisierung gelten, einschließlich der Klammerentfernung, was bedeutet, dass GCC korrekt akzeptiert wird.

Ich gebe zu, der Wortlaut ist nicht besonders klar. Welcher Compiler hat also Recht, das dritte Snippet zu behandeln? Findet die Klammerentscheidung bei der Listeninitialisierung statt oder nicht?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage