C'est un bogue de GCC.
Tout d'abord, les accolades autour de l'initialisateur scalaire (initialisation de liste pour le type scalaire) sont autorisées selon la norme [dcl.init.list]/3.9 :
Sinon, si la liste d'initialisation comporte un seul élément de type E et que soit T n'est pas un type de référence, soit son type référencé est lié à E, l'objet ou la référence est initialisé à partir de cet élément (par copie-initialisation pour l'initialisation par copie de liste, ou par initialisation directe pour l'initialisation par liste directe) ; si une conversion de restriction (voir ci-dessous) est nécessaire pour convertir l'élément en T, le programme est mal formé. [ Exemple :
int x1 {2}; // OK
int x2 {2.0}; // error: narrowing
- fin de l'exemple ]
Deuxièmement, Node<int>
est un agrégat selon [dcl.init.aggr]/1 :
Un agrégat est un tableau ou une classe avec
-
aucun constructeur fourni par l'utilisateur, explicite ou hérité ([class.ctor]),
-
aucun membre de données non statique privé ou protégé ([class.access]),
-
aucune fonction virtuelle, et
-
aucune classe de base virtuelle, privée ou protégée ([class.mi]).
L'initialisation de l'agrégat est donc effectuée et val
est initialisé en liste avec {args...}
de manière récursive selon [dcl.init.aggr]/4.2 :
Sinon, l'élément est initialisé par copie à partir de l'élément correspondant. clause d'initialisation ou le initialisateur d'accolade ou d'égalité de l'action correspondante clause d'initialisation désignée . Si cet initialisateur est de la forme Expression de mission ou = Expression de mission et qu'une conversion restrictive est nécessaire pour convertir l'expression, le programme est mal formé. [ Note : Si un initialisateur est lui-même une liste d'initialisateurs, l'élément est initialisé par la liste. ce qui entraînera l'application récursive des règles de ce paragraphe si l'élément est un agrégat. - note de fin ]
Puis [dcl.init.list]/3.9 s'applique à nouveau.
En conclusion, cette initialisation est bien définie.