如何解除std :: experimental :: optional?

时间:2014-11-12 21:37:40

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

使用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));

但我对如何脱离它感到茫然...

3 个答案:

答案 0 :(得分:9)

work = std::experimental::nullopt;

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

  

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

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

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

效果:如果*this参与,则调用val->T::~T()来销毁所包含的值;否则没有效果。

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

  

struct nullopt_t{ 见下文 };
  constexpr nullopt_t nullopt( 不确定 );

答案 1 :(得分:3)

这种解除可选项的最简单方法是使用foo = {};,它可以作为从已脱离的prvalue optional移动分配来解析。该规范实际上已经不再使用这种语法,否则这种语法与包含类型的赋值不一致。 (见[optional.object.assign] para 18-23 in N4023 for details

答案 2 :(得分:1)

通读了标题后,脱离std :: experimental :: optional的正确方法似乎是:

work = std::experimental::nullopt;