不受限制的工会上的位置删除
placement delete on unrestricted unions
我正在阅读c++11的wiki条目,发现了一个关于非限制并集的部分,在那里你为非平凡的memberlink调用placement new,但这里的例子与删除不匹配。
所以我的问题是:是否需要删除无限制联合的位置?如果是,如何?如果没有,为什么?调用析构函数就足够了吗?
示例:
class U_t
{
public:
union U
{
string s;
U () { new (s) string(); }
}
U _data;
~U_t () {
_data.s.~string();
//and now what?
}
}
§9.5/2如果联合的任何非静态数据成员具有非平凡的默认构造函数、复制构造函数、移动构造函数、复制赋值运算符、移动赋值运算符或析构函数,则必须由用户提供联合的相应成员函数,否则将为联合隐式删除该函数。
§9.5/3由于std::string声明了所有特殊成员函数的非平凡版本,[联合]将有一个隐式删除的默认构造函数、复制/移动构造函数、复制-移动赋值运算符和析构函数。若要使用[联合],必须由用户提供这些成员函数中的部分或全部。
§9.5/4通常,必须使用显式析构函数调用和放置新运算符来更改联合的活动成员。
所以,是的,它需要一个析构函数调用,类似于您所拥有的。
然而,要安全地使用这样的东西会复杂得多,因为你必须不断地跟踪活动的类型。要安全地使用非POD类型的并集真的很难。如果我是你,只使用POD,或者使用boost::variant
相关文章:
- C++ 从具有开始位置和结束位置的列表中删除
- 在双链表中的某个位置删除
- C++访问冲突读取位置0xDDDDDDCD当我尝试删除已更新的数组时
- 如何正确删除一行控件并在该位置动态创建一个新控件
- C++放置位置删除如何在内部(C++运行时)工作?如何克服其局限性?
- 从文件对象的当前位置删除字符
- 设置位置时QT删除对象()
- 我如何在代码中找到(和删除)需要管理员特权的位置
- 试图从链接列表中删除位置
- 指向对象的内存位置的指针已在程序中删除,但仍提供正确答案而不是垃圾值
- 在任意位置进行快速查找和删除的Deque样数据结构
- 应删除传递参数时创建对象的位置
- 如何在不删除任何字符的情况下将字符从字符串中的某个位置移动到其最前面
- 删除位置 (C++)
- C 删除具有内存位置的操作员
- 我可以使用C++删除堆栈中的特定位置数据吗?
- 不受限制的工会上的位置删除
- 如何根据列表中的位置删除特定项目
- 在列表末尾插入一个整数,并在第n个位置删除
- 为什么c++中没有位置删除表达式