在不受限制的工会上放置删除

时间:2012-09-10 23:45:30

标签: c++ c++11 unions

我正在阅读c ++ 11的wiki条目,我找到了一个无限制联合的部分,你可以为非平凡的成员link调用new,但是这里的示例与删除。

所以我的问题是:您是否需要为无限制联盟进行展示位置删除?如果有,怎么样?如果没有,为什么?调用析构函数就足够了吗?

示例:

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

1 个答案:

答案 0 :(得分:2)

9.5 / 2如果联合的任何非静态数据成员具有非平凡的默认构造函数,复制构造函数,移动构造函数,复制赋值运算符,移动赋值运算符或析构函数,则联合的相应成员函数必须是用户提供的,或者它将被隐式删除为工会。

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

9.5 / 4通常,必须使用显式析构函数调用和放置新运算符来更改联合的活动成员。

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

但是,安全地使用这样的东西会非常复杂,因为你必须不断地跟踪哪种类型是活跃的。为了安全地使用非POD类型的联合,真的很难。如果我是你,只使用POD,或使用boost::variant