为什么Boost中有两种变体类实现?

3
Boost似乎有两个变体类模板的实现: 这在Boost中很少见(虽然不是没有先例)。为什么会出现这种情况?这些变体有什么不同?
1个回答

5
第一种变量类模板是boost::variant,早于C++17的std::variant。查看此问题了解它与std::variant的比较。主要区别在于当变体内的值构造时抛出异常时应该怎么办。 std::variant 的选择是允许无值状态; boost::variant 的选择是在堆上构造新对象,而不是原地构造,并存储指向该位置的指针。 boost::variant2 是一个后来添加的库,希望一方面遵循 C++17 的 API,另一方面对其在这个问题上的选择表示不满意。 boost::variant2 选择了第三种选项,不同于前两种实现:双缓冲。 它占用了有问题类型的两倍大小; 在未使用的一半中构造新值,并且一旦构造成功-在另一半中销毁旧值。 如果所有类型都是无抛出构造函数,则不需要这样做,boost::variant2 实际上将不会具有双缓冲区。
这种选择意味着boost::variant2 永远不能没有值; 实际上,它的文档标题强调了这一事实。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接