我的目标是保证所有变体类型的单一存储:根据Boost::variant 的“永不空”保证,我们需要覆盖
boost::has_nothrow_copy
每个有界类型。但是稍后文档提到了一些内容'boost::blank'
,如果绑定了该类型,则变体将设置该值,而不是尝试不抛出默认的复制构造函数。
不清楚的是,如果在有界类型列表中添加 boost::blank 将避免覆盖/专门has_nothrow_copy
化其他类型的要求?
我的目标是保证所有变体类型的单一存储:根据Boost::variant 的“永不空”保证,我们需要覆盖
boost::has_nothrow_copy
每个有界类型。但是稍后文档提到了一些内容'boost::blank'
,如果绑定了该类型,则变体将设置该值,而不是尝试不抛出默认的复制构造函数。
不清楚的是,如果在有界类型列表中添加 boost::blank 将避免覆盖/专门has_nothrow_copy
化其他类型的要求?
我相信这已经说得很清楚了。这是 boost 文档中的相关部分:
因此,variant 旨在在满足其有界类型的以下标准后启用以下优化:
对于每个不可复制构造的有界类型 T(如 boost::has_nothrow_copy 所示),库保证变体将仅对 T 使用单一存储和就地构造。
如果任何有界类型不是默认可构造的(如 boost::has_nothrow_constructor 所示),则库保证变体将仅对变体中的每个有界类型使用单一存储和就地构造。但是请注意,在分配失败的情况下,未指定的 nothrow 默认构造的有界类型将在左侧操作数中默认构造,以保持永不为空的保证。
由于boost::blank
不是默认可构造的,因此第二个子句适用。听起来 Boost 已经对这种特定类型进行了特殊选择,以支持所有其他类型,因此如果可以选择,则不会指定将实例化哪个默认可构造类型,而是保证类型boost::blank
。