boost :: variant单存储保证

时间:2011-10-02 18:53:44

标签: c++ boost-variant

我的目标是保证所有变种类型的单一存储:根据'never empty' guarantee from Boost::variant,我们需要覆盖 每个有界类型boost::has_nothrow_copy。但是稍后 文档提到了有关'boost::blank'的内容,如果有的话 type是绑定的,variant将设置该值而不是尝试nothrow 默认复制构造函数。

目前尚不清楚的是在有界类型列表中添加boost :: blank 将避免覆盖/专门化has_nothrow_copy的要求 与其他类型?

1 个答案:

答案 0 :(得分:5)

我相信这一点已经明确了。以下是增强文档中的相关部分:

  

因此,变体旨在实现以下优化   一旦满足其有界类型的以下标准:

     

对于每个有限类型T,它不是可复制构造的(如   由boost :: has_nothrow_copy指示,库保证变体   将仅使用T的单个存储和就地构造。

     

如果有的话   有界类型不是默认可构造的(如表示的那样)   boost :: has_nothrow_constructor),库保证变量会   每个有界只使用单个存储和就地构造   键入变体。但请注意,如果分配   失败,未指定的nothrow默认可构造有界类型   将在左侧操作数中默认构造,以便   保留永不空虚的保证。

由于boost::blank不是默认可构造的,因此第二个子句适用。并且听起来Boost已经特殊地选择了这个特定的类型,以便选择其他所有类型,因此,如果没有指定哪个默认的可构造类型将被实例化,那么类型保证为boost::blank如果这是一个选项