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.
}