2015-02-04 9 views
6

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

risposta

5

Un'implementazione minima è

struct nullopt_t { 
    constexpr nullopt_t(int) {} 
}; 

Nessun costruttore di default verrà implicitamente dichiarata, [class.ctor]/4:

Se non esiste un costruttore dichiarato dall'utente per la classe X, un costruttore senza parametri è implicitamente dichiarato come predefinito (8.4).

... e nullopt_t possono essere costruiti da int, un tipo letterale.
Si noti che nel codice esiste un costruttore predefinito, sebbene venga definito come eliminato.

La definizione di cui sopra non soddisfare i requisiti di un tipo letterale:

Un tipo è un tipo letteralese è:
(10.5) - un tipo di classe (Clausola 9) che ha tutte delle seguenti proprietà:

  • ha un distruttore banale,
  • è un tipo di aggregato (8.5.1) o ha almeno un constexpr costruttore [..] che i s non è un costruttore di copia o spostamento e
  • tutti i suoi membri di dati non statici e le classi di base sono di tipi letterali non volatili.
+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

+0

@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