struct A{
    A(){}
};
union C{
   A a;
   int b = 0;
};
int main(){
    C c;
}

GCC reports the default constructor for union `C` is defined as
deleted.  However, the relevant rule in the current c++ standard says
that:
> A defaulted default constructor for class X is defined as deleted if:
>> X is a union that has a variant member with a non-trivial default 
>> constructor and no variant member of X has a default member initializer,
>> X is a non-union class that has a variant member M with a non-trivial 
>> default constructor and no variant member of the anonymous union containing 
>> M has a default member initializer

In simple, as long as one of these variant members has a default
member initializer, then the default constructor for the containing
class will not be defined as deleted.  In this example, the variant
member `b` has a default member initializer, hence `C::C()` should be
defined rather than deleted. Is it a bug?

GCC only agrees this code is supported:
struct A{
    A(){}
};
union C{
   A a{};
   int b;
};
int main(){
    C c;
}

If it is the right behavior, then the relevant rule should be described as:
> X is a union that has a variant member with a non-trivial default constructor 
> and no default member initializer is supplied for the variant member.

However, the rule does not say this.

Reply via email to