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.
}
Русский военный корабль идёт ко дну!
Re: anonymous unrestricted union
От: N. I.  
Дата: 08.03.17 09:01
Оценка: 8 (1)
Вопрос непонятен. Если с выбором конструктора копирования всё понятно, то дальше применяем 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 конструктора, думаю, вопросов не вызывает.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.