c++ - C++ 中的 union 与单个非平凡类型

标签 c++

我有一个简单的结构,它可以携带结果或错误,但不能同时携带两者。 两者都是同一类型,但为了清楚起见,我想要两个成员。 来自阅读cppreference.com看起来下面的代码片段是有效的 C++? 在 union 析构函数中使用放置删除来整理 非平凡的 类(在本例中为 std::string)。

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

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

最佳答案

union 只会降低代码的可读性。并且根据您的使用方式,它也会增加维护量。实际上,尽管有一个 std::string 成员,但您提到“实现 5 规则”这一事实表明,您的类将成为维护的噩梦。

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

  • 使用异常。您可以通过派生自 std::exception

  • 来创建自定义异常
  • 使用 Boost.Optional

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

关于c++ - C++ 中的 union 与单个非平凡类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37167417/

相关文章:

c++ - 可选的命令行参数

c++ - 在 C++ 中使用 system() 运行 2 个或更多 cmd 命令

c++ - Visual Studio 2017 警告说异常被基类捕获,但事实并非如此

c++ - 可变数量的(const)引用参数

c++ - 为什么你可以调用一个复制构造函数传入你正在构造的对象? (C++) (海合会)

c++ - 如何想出一个高缓存未命中率的例子?

c++ - 如何在我的文件阅读中包含空格

c++ - 析构函数和异步任务

C++ ofstream : evaluate close() error

c++ - 虽然循环没有中断,但使用 cin.ignore 和 cin.clear() 来验证输入