Как отключить std:: экспериментальный:: необязательный?

С помощью 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 ответа

Решение
work = std::experimental::nullopt;

должен отключиться work,
Фундаментальная библиотека TS указывается в [option.nullopt]:

Структура nullopt_t является пустым типом структуры, используемым в качестве уникального типа для обозначения отключенного состояния для необязательных объектов.

Существует соответствующий оператор присваивания, [необязательный.object.assign]:

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

Эффекты: если *this занимается звонками val->T::~T() уничтожить содержащуюся ценность; в противном случае никакого эффекта.

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

struct nullopt_t{увидеть ниже};
constexpr nullopt_t nullopt(неопределенные);

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

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

work = std::experimental::nullopt;
Другие вопросы по тегам