2014-11-11 1 views
12

Perché std::optional (std::experimental::optional in libC++ al momento) non ha la specializzazione per i tipi di riferimento (confrontato con boost::optional)?std :: specializzazione facoltativo per i tipi di riferimento

Penso che sarebbe un'opzione molto utile.

C'è qualche oggetto con riferimenti alle forse già esistenti oggetto semantica nella STL?

+9

Infine concludo, che posso usare 'std :: optional >' per i miei scopi. – Orient

risposta

7

Quando è stato discusso il n3406 (revisione n. 2 della proposta), alcuni membri del comitato erano a disagio con riferimenti facoltativi. In n3527 (revisione n. 3), gli autori hanno deciso di fare dei riferimenti opzionali una proposta ausiliaria, per aumentare le possibilità di ottenere valori opzionali approvati e inserirli in ciò che divenne C++ 14. Mentre facoltativo non è riuscito a farlo in C++ 14 per vari altri motivi, il comitato non ha rifiutato riferimenti opzionali ed è libero di aggiungere riferimenti opzionali in futuro se qualcuno lo proporrà.

0

Se azzardassi un'ipotesi, sarebbe a causa di questa frase nelle specifiche di std :: experimental :: facoltativo. (Sezione 5.2, p1)

Un programma che richiede l'istanza di modello optional per un tipo di riferimento, o per i tipi possibilmente cv-qualificati in_place_t o nullopt_t è mal formata.

+2

Forse è giusto, ma non riesco a capire lo sfondo delle conclusioni cieted. – Orient

+0

@Orient che è standard per "' opzionale' non può essere utilizzato con riferimenti e questi due tipi speciali "- in altre parole non è progettato per funzionare con essi. In realtà, la tua domanda è un altro modo per dire "perché lo standard contiene quella clausola?" –

+1

@ArneMertz Hai ragione, ma è importante capire le intenzioni del cometee. – Orient

4

c'è davvero qualcosa che ha riferimenti alle forse esistenti oggetto semantica. Si chiama un puntatore (const). Un semplice puntatore non proprietario. Ci sono tre differenze tra riferimenti e puntatori:

  1. I puntatori possono essere nulli, i riferimenti non si può. Questa è esattamente la differenza che vuoi aggirare con std::optional.
  2. I puntatori possono essere reindirizzati per indicare qualcos'altro. Rendilo const, e anche questa differenza scompare.
  3. I riferimenti non devono essere dereferenziati da -> o *. Questo è puro zucchero sintattico e possibile a causa di 1. E la sintassi del puntatore (dereferenziamento e convertibile in bool) è esattamente ciò che fornisce per accedere al valore e testarne la presenza.

Aggiornamento: optional è un contenitore di valori. Come altri contenitori (vector, ad esempio) non è progettato per contenere riferimenti. Se si desidera un riferimento facoltativo, utilizzare un puntatore o se si ha effettivamente bisogno di un'interfaccia con una sintassi simile a std::optional, creare un piccolo (e banale) wrapper per i puntatori.

Update2: Per quanto riguarda la domanda perché non c'è questa specializzazione: perché il comitato ha fatto semplicemente optare fuori. La motivazione potrebbe essere trovata da qualche parte nei documenti. Forse è perché hanno considerato i puntatori sufficienti.

+10

Ancora, per la programmazione generica si vorrebbe 'std :: opzionale ' wo funzionare anche quando 'T == U &'. Spiegate piuttosto bene come 'std :: optinal ' può essere implementato con 'U * const' ma questo non è di certo un aiuto nella programmazione generica. – MSalters

+2

@MSalters Non vedo perché lo vorrebbe. 'opzionale' è strettamente per valori. Vedi il mio aggiornamento alla risposta. "programmazione generica" ​​non è una giustificazione blanco per avere qualcosa di immaginabile. Se ti capita di imbatterti in un'occasione in cui desideri supportare valori facoltativi * e * riferimenti opzionali, usa la specializzazione per distinguere tra 'opzionale' e i puntatori o la classe wrapper che menziono. –