anonymous unrestricted union
От: Alexander G Украина  
Дата: 06.03.17 11:48
Оценка:
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.
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.