0

最近,我观看了Andrei Alexandrescu发表的关于“C++ 中的系统错误处理”的演讲。提议的 Expected 模板的结构如下:

template<class T> class Expected {
    union {
        T ham;
        std::exception_ptr spam;
    };
    bool gotHam;
};

使用联合使实现有点复杂,因为您需要按gotHam字段分支,然后决定如何处理联合中的数据。即初始化列表上的初始化不能为ham和完成spam

我想知道简化版本是否会更好。

template<class T> class Expected {
    union { T ham; };
    std::exception_ptr spam;
};

在这种情况下spam,无论何时发生错误,都可以用作指示器。

4

2 回答 2

1

我的评论被重写为答案:

你的版本有几个问题:

  • 而不是sizeof(Expected) == max(sizeof(T), sizeof(std::exception_ptr)) + sizeof(bool)你有sizeof(Expected) == sizeof(T) + sizeof(std::exception_ptr). 由于 std::exception_ptr 更像是一个智能指针而不是普通指针,它可能会大得多。
  • std::exception_ptr 不能保证是 constexpr 并且您总是必须构造它。这意味着 Expected 不能是 constexpr 并且仍然是可移植的。

对于所有缺点,您仍然必须打开异常指针,它不亚于 bool 复杂。

于 2013-10-18T12:04:36.117 回答
1

您可以在火腿上使用指针,这样就不会调用默认构造函数,并且您不需要在您的版本中没有真正意义的联合。

另外,我认为您的版本不会改变分支的需要,因为您仍然需要测试异常指针而不是布尔值。

于 2013-10-18T11:31:52.950 回答