Как отключить std :: experimental :: optional?

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

Но я не знаю, как его отключить ...


person Riot    schedule 12.11.2014    source источник


Ответы (3)


work = std::experimental::nullopt;

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

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

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

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

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

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

struct nullopt_t{ см. Ниже };
constexpr nullopt_t nullopt( не указано );

person Columbo    schedule 12.11.2014
comment
В любом случае единственный (безумный) способ создать объект типа nullopt_t - это скопировать nullopt. - person Luc Danton; 15.11.2014
comment
@LucDanton ... или копирование объекта типа nullopt_t, который был инициализирован копированием nullopt. - person Columbo; 15.11.2014
comment
Итак, в конечном итоге все сводится к nullopt. - person Luc Danton; 15.11.2014

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

person Casey    schedule 12.11.2014
comment
Хм, с моим примером, который вызывает ошибку компилятора: ошибка: использование удаленной функции 'std :: experimental :: optional ‹boost :: asio :: io_service :: work› & std :: experimental :: optional ‹boost :: asio :: io_service :: work ›:: operator = (std :: experimental :: optional‹ boost :: asio :: io_service :: work ›&&) ' - person Riot; 13.11.2014

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

work = std::experimental::nullopt;
person Riot    schedule 12.11.2014