c++ - 为什么Boost中有两个变体类实现?
问题描述
Boost 似乎有两个变体类模板的实现:
Boost 两个包含两个采用相同概念的情况很少见(尽管并非闻所未闻)。为什么变体会发生这种情况?这些变体有何不同?
解决方案
第一种变体类模板boost::variant
,早于 C++17 的std::variant
. 请参阅此问题以获取与 的比较std::variant
。主要区别在于当在变体中构造值时引发异常时该怎么做。
std::variant
选择是允许无价值的状态;选择是在boost::variant
堆上而不是就地构造新对象,并存储指向该位置的指针。
boost::variant2
是后来的补充,一方面希望坚持C++17 API,另一方面则是表达了对其在这件事上的选择的不满。
boost::variant2
选择第三个选项,与之前的两个实现不同:双缓冲。它占用了问题类型的两倍;在未使用的一半中构造一个新值,一旦构造成功 - 销毁另一半中的旧值。如果所有类型都不是throw-constructible,那么这不是必需的,并且boost::variant2
实际上不会有双缓冲区。
这种选择意味着boost::variant2
永远不会一文不值;事实上,它的文档标题强调了这一事实。
推荐阅读
- google-chrome - 注入的功能不适用于内容和 background.js
- powershell - 合并/连接来自 2 个不同 foreach 循环的两个结果
- javascript - 如何使用自定义原型中的函数 - object.create
- python - 在 csv 文件 Python 中查找特定值
- javascript - JavaScript:querySelector - 也匹配顶部元素
- r - 在 Amazon Web Services 上安装 RStudioAMI 错误:
- javascript - 检查警报是否被阻止
- javascript - 如何存储我设置为在其他组件中使用的状态(以便我可以将该组件的值发送到数据库)
- php - 登录表单重新出现在每个页面上
- kubernetes - Envoy 代理返回 500