N3797::9.5/2 [class.union]
говорит:
Если какой-либо нестатический член данных объединения имеет нетривиальное значение по умолчанию конструктор (12.1), конструктор копирования (12.8), конструктор перемещения (12.8), оператор присваивания копии (12.8), оператор присваивания перемещения (12.8) или деструктор (12.4), соответствующая членная функция объединения должна быть предоставленным пользователем или он будет неявно удален (8.4.3) для объединение
Я пытался понять эту заметку на примере:
#include <iostream>
#include <limits>
struct A
{
A(const A&){ std::cout << "~A()" << std::endl; } //A has no default constructor
};
union U
{
A a;
};
U u; //error: call to implicitly-deleted default constructor of 'U'
int main()
{
}
Это поведение мне не совсем понятно. struct A
не имеет неявно объявленного конструктора по умолчанию, потому что 12.1/4: [class.ctor]
говорит:
Если для класса X нет объявленного пользователем конструктора, конструктор без параметров неявно объявляется как дефолт (8.4).
Это означает, что struct A
не имеет нетривиального конструктора по умолчанию (вообще нет конструктора по умолчанию, в частности нетривиального). Для этого union U
не нужно иметь удаленный конструктор по умолчанию. Что не так?