Как отключить 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));

Но я в растерянности из-за того, как его отключить …

5

Решение

work = std::experimental::nullopt;

должен отключиться work,
библиотека фундаментальных ТС указывает в [опционально. nullopt]:

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

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

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

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

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

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

9

Другие решения

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

3

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

work = std::experimental::nullopt;
1
По вопросам рекламы [email protected]