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