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

问题描述 投票:0回答:1

Boost 似乎有两种变体类模板的实现:

Boost 很少(尽管并非闻所未闻)包含同一概念的两个版本。为什么变体会发生这种情况?这些变体有何不同?

c++ boost boost-variant boost-variant2
1个回答
9
投票

第一种变体类模板

boost::variant
,早于 C++17 的
std::variant
。 请参阅这个问题
std::variant
的比较。主要的区别在于,当在变体中构造值时引发异常时该怎么做。

std::variant
选择是允许无价值的状态;
boost::variant
选择是在堆上而不是就地构造新对象,并存储指向该位置的指针。

boost::variant2
是后来添加的,一方面希望遵守C++17 API,另一方面也是表达了对其在此事上的选择的不满。

boost::variant2
选择第三个选项,与之前的两个实现不同:双缓冲。它占用的大小是有问题的类型的两倍;在未使用的一半中构造一个新值,一旦构造成功 - 销毁另一半中的旧值。如果所有类型都是不可抛出移动构造的,则没有必要,并且
boost::variant2
实际上不会有双缓冲区。

这个选择意味着

boost::variant2
可以永远不会毫无价值;事实上,它的文档标题强调了这一事实。

© www.soinside.com 2019 - 2024. All rights reserved.