С помощью 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));
Но я в растерянности из-за того, как его отключить …
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(
неопределенные);
Этот самый простой способ отключить дополнительный foo = {};
, который разрешается как назначение перемещения из отключенного значения optional
, Спецификация фактически делает все возможное, чтобы включить этот синтаксис, который в противном случае был бы неоднозначным с присваиванием из содержащегося типа. (Увидеть [option.object.assign] пункт 18-23 в N4023 для деталей)
Прочитав заголовки, правильный способ отключить std :: эксперимент :: необязательно выглядит так:
work = std::experimental::nullopt;