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> 中存储引用而不是复制对象?

C++ 中 boost::variant 的二维向量

使用 boost::variant 库制作地图。如何将事物存储和显示为正确的类型?

C++ Boost 变体错误

将由 boost::variant 聚合的类型的对象传递给接受该 boost::variant 的函数

如何返回由 boost::variant 返回类型中包含的类型的子集组成的 boost::variant