微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决为什么 Boost 中有两个变体类实现?

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

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

解决方法

第一种变体类模板 boost::variant 早于 C++17 的 std::variant。参见 this questionstd::variant 的比较。主要区别在于,当构造变体中的值时引发异常时该怎么办。

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

std::variant2是后来的补充,一方面是希望坚持C++17 API,另一方面是对其在这件事上的选择的不满。

>

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

这个选择意味着boost::variant2不可能永远没有价值;事实上,它的文档标题强调了这一事实。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。