Here è descritta la nullopt_t
e nullopt
per l'oggetto optional
proposto per C++:costruttore nullopt_t sperimentale :: opzionale
struct nullopt_t{see below}; constexpr nullopt_t nullopt(unspecified);
[...] Tipo nullopt_t non deve avere un costruttore di default. Deve essere un tipo letterale . Il nullopt costante deve essere inizializzato con un argomento di tipo letterale.
La ragione di questo è spiegato nel The op = {} syntax capitolo del documento: per la op = {}
di essere inequivocabile alcuni trucchi devono essere adottate, una delle quali è che nullopt_t
non devono essere costruibile di default.
La mia domanda riguarda cosa significa il tipo letterale qui? Ho trovato questo SO post. Quindi mi sembra che solo un'altra classe vuota farebbe. Potrebbe anche essere un costruttore che prende uno int
?
Quale sarebbe un aspetto di classe nullopt_t
conforme al minimo?
Qualcosa di simile a questo:
struct nullopt_t_construct_tag_t{};
struct nullopt_t {
nullopt_t() = delete; // I know declaring it as deleted is redundant
constexpr nullopt_t(nullopt_t_construct_tag_t) {};
};
constexpr nullopt_t nullopt(nullopt_t_construct_tag_t{});
O questo:
struct nullopt_t {
nullopt_t() = delete;
constexpr nullopt_t(int) {};
};
constexpr nullopt_t nullopt(0);
Potrebbe questo percorso nella qualità dei problemi di attuazione, in cui un 'int' viene passato ad un optional, e viene convertito in un' nullopt_t' e utilizzati per costruire il opzionale, e le cose inaspettate risultato? – Yakk
@Yakk Se il tipo di valore dell'optional può essere costruito da un int, allora la risoluzione di sovraccarico farà in modo che venga scelto il costruttore (modello) giusto. Se no ... Allora hai ragione. Rendere esplicito il costruttore di cui sopra dovrebbe risolvere questo problema. – Columbo