不受限制的工会上的位置删除

placement delete on unrestricted unions

本文关键字:位置 删除 受限制      更新时间:2023-10-16

我正在阅读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