c++ - 放置删除不受限制的 union

标签 c++ c++11 unions

我正在阅读 c++11 的 wiki 条目,我发现了一个不受限制的 union 部分,您在其中为非平凡成员调用 placement new link , 但是这里的例子没有匹配到删除。

所以我的问题是:您是否需要为 unrestricted union 删除展示位置?如果是,如何?如果不是,为什么?调用析构函数就足够了吗?

例子:

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 如果 union 的任何非静态数据成员具有非平凡的默认构造函数、复制构造函数、移动构造函数、复制赋值运算符、移动赋值运算符或析构函数,则 union 的相应成员函数必须由用户提供,否则将为 union 隐式删除。

§ 9.5/3 由于 std::string 声明了所有特殊成员函数的非平凡版本,[ union ] 将具有隐式删除的默认构造函数、复制/移动构造函数、复制/移动赋值运算符和析构函数.要使用[ union ],部分或全部这些成员函数必须由用户提供。

§ 9.5/4 通常,必须使用显式析构函数调用和放置新运算符来更改 union 的事件成员。

所以是的,它需要一个析构函数调用,类似于您所拥有的。

但是,要安全地使用这样的东西会复杂得多,因为您必须不断跟踪事件的类型。安全地使用具有非 POD 类型的 union 是真的困难的。如果我是你,只使用 POD,或者使用 boost::variant

关于c++ - 放置删除不受限制的 union ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12360893/

相关文章:

c - 如何使用包含结构的 union ?

c++ - 布局兼容类型的 union

c++ - std::shared_ptr 为空但不为 null

c++ - 默认参数的函数特征

c++ - 为什么文字操作符不能正常地模板化?

c++ - C++中的私有(private)继承

c++ - 如何构建 NS-3 以使用 C++0x/C++11 库?

c++ - 如何用 0 memset 匿名 union

c++ - 指针编译器问题

c++ - 进程间对象传递