размещение удалить на неограниченные союзы

Я читал вики для c ++ 11 и нашел раздел для неограниченного объединения, где вы называете размещение новым для нетривиального членассылка на сайт, Но приведенный здесь пример не соответствует удалению.

Поэтому мой вопрос: вам нужно удалить место размещения для неограниченный союз? Если да, то как? Если нет, то почему? Будет ли достаточно вызова деструктора?

пример:

class U_t
{
public:
union U
{
string s;
U () { new (s) string(); }
}
U _data;
~U_t () {
_data.s.~string();
//and now what?
}
}

3

Решение

§ 9.5 / 2 Если любой нестатический член данных объединения имеет нетривиальный конструктор по умолчанию, конструктор копирования, конструктор перемещения, оператор копирования, оператор присваивания перемещения или деструктор, соответствующая функция-член объединения должна быть пользовательской предоставляется или будет неявно удален для объединения.

§ 9.5 / 3 Поскольку std :: string объявляет нетривиальные версии всех специальных функций-членов, [union] будет иметь неявно удаленный конструктор по умолчанию, конструктор копирования / перемещения, оператор назначения копирования / перемещения и деструктор. Чтобы использовать [объединение], некоторые или все эти функции-члены должны быть предоставлены пользователем.

§ 9.5 / 4 В общем случае для изменения активного члена объединения необходимо использовать явные вызовы деструктора и размещение новых операторов.

Так что да, это требует вызова деструктора, аналогичного тому, что у вас есть.

Тем не менее, безопасно использовать такую ​​вещь гораздо сложнее, так как вам придется постоянно отслеживать, какой тип был активным. Безопасное использование объединения с не POD-типами действительно жесткий. Если бы я был вами, используйте только POD или используйте boost::variant

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]