【问题标题】:How to disengage std::experimental::optional?如何脱离 std::experimental::optional?
【发布时间】:2014-11-12 21:37:40
【问题描述】:

借助 Boost,我可以就地创建一个可选的:

boost::optional<boost::asio::io_service::work> work = boost::in_place(boost::ref(io_service));

然后解除它:

work = boost::none;

借助 C++14 / 实验性支持,我可以改为构建一个可选的就地:

std::experimental::optional<boost::asio::io_service::work> work;
work.emplace(boost::asio::io_service::work(io_service));

但我不知道如何脱离它......

【问题讨论】:

    标签: c++ c++14 optional boost-optional


    【解决方案1】:
    work = std::experimental::nullopt;
    

    应该退出work
    library fundamental TS 在 [optional.nullopt] 中指定:

    struct nullopt_t 是一个空结构类型,用作唯一 类型以指示可选对象的分离状态。

    有一个合适的赋值运算符,[optional.object.assign]:

    optional<T>& operator=(nullopt_t) noexcept;
    

    效果:如果*this 被调用,则调用val-&gt;T::~T() 来销毁包含的值;否则无效。

    为了避免每次都构造一个nullopt_t对象,已经声明了一个这种类型的常量:

    struct nullopt_t{见下文};
    constexpr nullopt_t nullopt(未指定);

    【讨论】:

    • 在任何情况下,构造nullopt_t 类型对象的唯一(ish)方法是复制nullopt
    • @LucDanton ... 或复制 nullopt_t 类型的对象,该对象通过复制 nullopt 进行初始化。
    • 所以,最终,这一切都归结为nullopt
    【解决方案2】:

    解除可选项的最简单方法是使用foo = {};,它被解析为来自解除的纯右值optional 的移动分配。规范实际上竭尽全力启用这种语法,否则这种语法对于包含类型的赋值会产生歧义。 (见[optional.object.assign] para 18-23 in N4023 for details

    【讨论】:

    • 嗯,我的示例引发编译器错误:错误:使用已删除的函数 'std::experimental::optional<:asio::io_service::work>& std::experimental ::可选<:asio::io_service::work>::operator=(std::experimental::optional<:asio::io_service::work>&&)'
    【解决方案3】:

    通读标题后,解除 std::experimental::optional 的正确方法似乎是:

    work = std::experimental::nullopt;
    

    【讨论】:

      猜你喜欢
      • 2017-04-10
      • 1970-01-01
      • 2016-10-20
      • 1970-01-01
      • 1970-01-01
      • 2016-03-28
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      相关资源
      最近更新 更多