unrestricted union:
9.5/2 утверждает, что не-тривиальные дефолтный конструктор, копирующий/перемещающий конструктор, оператор присвоения или деструктор неявно удаляет соотвествующий метод из union.
9.5/3 приводит пример
anonymous union:
9.5/5 описывает сам anonymous union
9.5/8 описывает union-like class — класс, содержащий anonymous union
Но из чего следует, что следуюший пример должен работать, а именно:
* неявные запреты для anonymous union переносятся на S
* запрет конструктора/деструктора перекрыт их явным определением, запрет копирования и присвоения в силе
?
#include <iostream>
#include <string>
struct S
{
union
{
std::string s;
int i;
};
S()
{
new (&s) std::string("Hello, world!");
}
~S()
{
(&s)->~basic_string();
}
};
int main()
{
S s; // works
std::cout << s.s; // works
S s1(s); // error, S(const S&) implicitly deleted.
}
Вопрос непонятен. Если с выбором конструктора копирования всё понятно, то дальше применяем C++14 12.8/11:
An implicitly-declared copy/move constructor is an inline public member of its class. A defaulted copy/
move constructor for a class X is defined as deleted (8.4.3) if X has:
— a variant member with a non-trivial corresponding constructor and X is a union-like class,
К чему приводит вызов deleted конструктора, думаю, вопросов не вызывает.