AFAIK, the code below shouldn't compile, but it does in clang and GCC. What am I missing here?
c++, c++11, language-lawyer
Solution
The bullet is
`X` is a union-like class that has a variant member with a non-trivial default constructor
which is parsed as
`X` is a union-like class that has (a variant member with a non-trivial default constructor)
i.e., "with a non-trivial default constructor" applies to the type of the variant member, not `X`.
Problem
The code below shows a union-like class with a non-trivial default constructor (member `y` is initialized with a brace-or-equal-initializer), so if a default constructor for such a class is defaulted, it should be deleted according to §12.1/5 first bullet point. That is, the declaration `T t;` should not compile, as there is no default constructor for the `union T`. But the code compiles and executes in clang and GCC. ``` #include <iostream> union T { int y{1}; float x; char c; T() = default; }; int main() { T t; std::cout << t.y << '\n'; } ``` EDIT My question above was wrong right from the start, as the union T is not a union-like class. I just came to know about §9.5/8 in C++11 which says: A union-like class is a union or a class that has an anonymous union as a direct member. A union-like class X has a set of variant members. If X is a union its variant members are the non-static data members; otherwise, its variant members are the non-static data members of all anonymous unions that are members of X. Now, consider the snippet below. It doesn't compile because the default constructor for the union is deleted. But I still, don't know which bullet point in §12.1/5 is reponsible for this result. Note that again, the union is not a union-like class and so, the first bullet point in §12.1/5 doesn't apply. But that's what the error message says in both clang and GCC. See live example. ``` #include <iostream> union T{ int y; struct A{ int i; A():i{1} {} } a; }; int main() { T t; std::cout << t.a.i << '\n'; } ```