【问题标题】:boost::variant single storage guaranteeboost::variant 单一存储保证
【发布时间】:2011-10-02 18:53:44
【问题描述】:

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

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

【问题讨论】:

    标签: c++ boost-variant


    【解决方案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)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多