2014-11-12 2 views
5

С Boost, можно создать дополнительный в месте с: Как отключить std :: experimental :: optional?

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

Но я в растерянности, как расцепить его ...

ответ

9
work = std::experimental::nullopt; 

должен абстрагироваться work.
В library fundamental TS указывает в [optional.nullopt]:

The struct nullopt_t is an empty structure type used as a unique type to indicate a disengaged state for optional objects.

Существует соответствующий оператор присваивания, [optional.object.assign]:

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

Effects: If *this is engaged calls val->T::~T() to destroy the contained value; otherwise no effect.

Чтобы избежать конструирует nullopt_t объект каждый раз, константа такого типа уже объявлена:

struct nullopt_t{see below};
constexpr nullopt_t nullopt(unspecified);

+0

В любом случае единственным способом (ish) вы можете построить объект типа «nullopt_t', копируя« nullopt ». –

+0

@LucDanton ... или копирование объекта типа 'nullopt_t', который был инициализирован путем копирования' nullopt'. – Columbo

+0

Итак, в конечном итоге все сводится к 'nullopt'. –

1

Прочитав заголовки, правильный путь, чтобы расцепить зЬй :: экспериментальный :: факультативные, как представляется:

work = std::experimental::nullopt; 
3

Этот самый простой способ отключить опциональный с foo = {};, который разрешен как назначение перехода от отключенного значения optional. Спецификация фактически выходит из своего пути, чтобы включить этот синтаксис, который в противном случае был бы двусмысленным с назначением из содержащегося в нем типа. (См. [optional.object.assign] para 18-23 in N4023 for details)

+2

Хмм, с моим примером, который вызывает ошибку компилятора: Ошибка: использование удаленной функции 'std :: experimental :: optional & std :: experimental :: optional :: оператор = (станд :: экспериментальный :: опциональный <повышение :: ASIO :: io_service :: работа> &&)» – Riot