5

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

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

4

3 回答 3

10
work = std::experimental::nullopt;

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

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

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

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

效果:如果*this参与调用val->T::~T()破坏包含的值;否则没有效果。

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

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

于 2014-11-12T21:42:49.637 回答
3

解除可选项的最简单方法是 with foo = {};,它被解析为从解除的纯右值的移动分配optional。该规范实际上竭尽全力启用这种语法,否则这种语法对于所包含类型的赋值会产生歧义。(有关详细信息,请参阅 N4023 中的 [optional.object.assign] 第 18-23 段

于 2014-11-12T22:21:04.330 回答
1

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

work = std::experimental::nullopt;
于 2014-11-12T21:37:40.330 回答