boost::variant 单一存储保证
Posted
技术标签:
【中文标题】boost::variant 单一存储保证【英文标题】:boost::variant single storage guarantee 【发布时间】:2011-10-02 18:53:44 【问题描述】:我的目标是保证所有变体类型的单一存储:根据'never empty' guarantee from Boost::variant,我们需要覆盖
boost::has_nothrow_copy
用于每个有界类型。但稍晚一点
文档中提到了有关'boost::blank'
的内容,如果那样的话
类型已绑定,变体将设置该值而不是尝试不抛出
默认复制构造函数。
不清楚的是是否在有界类型列表中添加 boost::blank
将避免覆盖/专门化has_nothrow_copy
的要求
其他类型?
【问题讨论】:
【参考方案1】:我相信这已经说得很清楚了。这是 boost 文档中的相关部分:
因此,variant 旨在实现以下优化 一旦满足以下关于其有界类型的条件:
对于每个不可复制构造的有界类型 T(如 由 boost::has_nothrow_copy 指示),库保证变体 将仅对 T 使用单一存储和就地构造。
如果有的话 有界类型不是默认可构造的(如 boost::has_nothrow_constructor),库保证变体将 对于每个有界的,仅使用单个存储和就地构造 输入变体。但请注意,在分配的情况下 failure,未指定的 nothrow 默认可构造的有界类型 将在左侧操作数中默认构造,以便 保持永不为空的保证。
由于boost::blank
不是默认可构造的,因此第二个子句适用。听起来 Boost 已经对这个特定类型进行了特殊选择,以支持所有其他类型,因此如果可以选择,则不会指定将实例化哪个默认可构造类型,而是保证类型为 boost::blank
。
【讨论】:
嗯,我还得再读几遍才明白,谢谢! +1 我正要回答这个问题!这个问题是 45 分钟前的!该死的你! ;-) 我可以确认std::cout << boost::has_nothrow_constructor<boost::blank>::value << "\n";
输出1
(true)。以上是关于boost::variant 单一存储保证的主要内容,如果未能解决你的问题,请参考以下文章
如何在 boost::variant<T> 中存储引用而不是复制对象?
使用 boost::variant 库制作地图。如何将事物存储和显示为正确的类型?