2014-11-12 5 views
5

Con Boost posso creare un optional sul posto con: Come disattivare std :: experimental :: facoltativo?

boost::optional<boost::asio::io_service::work> work = boost::in_place(boost::ref(io_service)); 

E disimpegnarsi con:

work = boost::none; 

Con C++ 14/supporto sperimentale, posso invece costruire un opzionale -Place con:

std::experimental::optional<boost::asio::io_service::work> work; 
work.emplace(boost::asio::io_service::work(io_service)); 

Ma io sono in perdita per il modo di liberarla ...

risposta

9
work = std::experimental::nullopt; 

dovrebbe disimpegnarsi work.
I library fundamental TS precisa, [optional.nullopt]:

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

V'è un operatore di assegnazione appropriata, [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.

Per evitare di costruire un oggetto nullopt_t ogni volta, una costante di questo tipo è già stata dichiarata:

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

+0

In ogni caso l'unico modo (ish) di costruire un oggetto di tipo 'nullopt_t' è copiando' nullopt'. –

+0

@LucDanton ... o copiare un oggetto di tipo 'nullopt_t' che è stato inizializzato copiando' nullopt'. – Columbo

+0

E così, alla fine, tutto si riduce a 'nullopt'. –

1

Dopo aver letto attraverso le intestazioni, il modo corretto per disimpegnare la std :: :: sperimentale appare facoltativi da:

work = std::experimental::nullopt; 
3

Questo modo più semplice per disattivare un opzionale è con foo = {};, che viene risolto come assegnazione di spostamento da un valore disattivato optional. La specifica si spegne per abilitare questa sintassi che altrimenti sarebbe ambigua con l'assegnazione dal tipo contenuto. (Vedi [optional.object.assign] para 18-23 in N4023 for details)

+2

Hmm, con il mio esempio che genera un errore del compilatore: errore: uso della funzione cancellata 'std :: experimental :: opzionale & std :: experimental :: opzionale :: operator = (std :: :: sperimentale opzionale &&)' – Riot