S'il est bien formé. A
est un agrégat1, et, selon le projet de N3936, un vide d'initialiseur de la liste utilisée en direct-initialisation de la liste de l'ensemble des résultats dans l'ensemble de l'initialisation:
De § 8.5.4/3 Liste d'initialisation [dcl.init.liste]:
Liste d'initialisation d'un objet ou d'une référence de type T est défini comme suit:
- Si T est un agrégat, agrégée d'initialisation est effectuée (8.5.1).
[ Exemple:
struct S2 { int m1; double m2, m3; };
....
S2 s23{}; // OK: default to 0,0,0
....
fin de l'exemple ]
....
Les changements pertinents entre le C++11 et C++1y sont un changement dans la priorité de l'ensemble vs valeur d'initialisation pour le cas des agrégats:
C++11 mène avec
Liste d'initialisation d'un objet ou d'une référence de type T est défini comme
suit:
- Si l'initialiseur de liste n'a pas d'éléments et T est une classe
type avec un constructeur par défaut, l'objet est la valeur d'initialisation.
- Sinon, si T est un agrégat, agrégée d'initialisation est effectuée (8.5.1)....
suivie par l'exemple ci-dessus.
C++1y donne la priorité à l'agrégation d'initialisation:
Liste d'initialisation d'un objet ou d'une référence de type T est défini comme suit:
- Si T est un agrégat, agrégée d'initialisation est effectuée (8.5.1).
....
- Sinon, si l'initialiseur de liste n'a pas d'éléments et T est un type de classe avec un constructeur par défaut, l'objet est la valeur d'initialisation.
1 Pourquoi est - A
un agrégat?
C'est un ensemble à la fois en C++11 et C++14.
C++1y:
8.5.1 Agrégats [dcl.init.aggr]
Un agrégat est un tableau ou une classe (Clause 9) sans que l'utilisateur fourni par les constructeurs (12.1), aucun privés ou protégés non-membres de données statiques (Clause 11), pas de classes de base (article 10), et pas de fonctions virtuelles (10.3).
La seule partie qui n'est pas évidente est de savoir si le constructeur par défaut est fourni par l'utilisateur ou non. Il n'est pas:
Dans le § 8.4.2 [dcl.fct.def.par défaut]:
Une fonction est fourni par l'utilisateur si elle est déclarée et non explicitement
par défaut ou supprimé sur sa première déclaration.