在c ++中使用单个非平凡类型的联合

时间:2016-05-11 15:42:24

标签: c++

我有一个简单的结构,可以携带结果或错误,从不两者。 两者都是相同的类型,但为了清楚起见,我想要两个成员。 从阅读cppreference.com看起来下面的代码片段是有效的c ++? 在union析构函数中使用placement delete来整理non trivial类(在此实例中为std :: string)。

struct Result {
  union {
    std::string resultText;
    std::string errorText;
    ~(){ resultText.~string();}
  };
};

看起来,要使用它,包含结构需要实现5规则成员来显式复制/移动resultText。

1 个答案:

答案 0 :(得分:1)

联盟只会降低代码的可读性。根据您的使用方式,它也会增加维护。实际上你提到了实施5"的规则。尽管有std::string成员表示你的班级将成为维持的噩梦。

我会看一下这些选项(在问题中没有足够的细节来确定什么是最好的):

  • 使用例外。您可以通过从std::exception

  • 派生来制作自定义例外
  • 使用Boost.Optional

    boost::optional<std::string> do_something() { ... };
    
    std::string result = do_something().value_or("error!");