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

Rio*_*iot 5 c++ optional boost-optional c++14

使用Boost,我可以创建一个可选的就地:

boost::optional<boost::asio::io_service::work> work = boost::in_place(boost::ref(io_service));
Run Code Online (Sandbox Code Playgroud)

并解除它:

work = boost::none;
Run Code Online (Sandbox Code Playgroud)

有了C++ 14 /实验支持,我可以使用以下方法构建一个可选的就地:

std::experimental::optional<boost::asio::io_service::work> work;
work.emplace(boost::asio::io_service::work(io_service));
Run Code Online (Sandbox Code Playgroud)

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

Col*_*mbo 9

work = std::experimental::nullopt;
Run Code Online (Sandbox Code Playgroud)

应该脱离work.
库基本TS指定[optional.nullopt]:

struct nullopt_t是一个空结构类型,用作唯一类型,表示可选对象的脱离状态.

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

optional<T>& operator=(nullopt_t) noexcept;
Run Code Online (Sandbox Code Playgroud)

效果:如果*this被调用则val->T::~T()销毁包含的值; 否则没有效果.

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

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