2011-10-02 94 views
4

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

有什么不清楚的是,如果在有界类型列表 将避免覆盖的要求加入的boost ::空白/专业has_nothrow_copy 与其他类型的?

回答

5

我相信这一点很清楚。下面是从升压文档的相关部分:

因此,变体被设计为启用下列优化 一次以下标准在其界类型都满足:

对于每个有界类型T是抛出异常拷贝构造(如升压:: has_nothrow_copy表示 ),库保证变种 将只使用单一的存储和就地建设T.

如果任何 界类型是无抛出缺省constructible(指示通过 boost :: has_nothrow_constructor),该库保证变体 仅对变体中的每个有界 类型使用单个存储和就地构造。但是,请注意,如果发生指派 失败,则将在左侧操作数中默认构造一个未指定的未指定缺省构造的有界类型 ,以便 保留永不为空的保证。

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

+0

嗯,我必须多读几遍,才能感觉到我的头骨,谢谢! – lurscher

+0

+1我正要回答这个问题!问题是45分钟的老!该死的你! ;-) –

+0

我可以确认'std :: cout << boost :: has_nothrow_constructor :: value <<“\ n”;'输出'1'(true)。 –