使用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));
但我对如何脱离它感到茫然...
答案 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;