2014-11-11 12 views
12

Warum std::optional (std::experimental::optional in libC++ im Moment) nicht Spezialisierung für Referenztypen (im Vergleich mit boost::optional)?std :: optional Spezialisierung für Referenztypen

Ich denke, es wäre eine sehr nützliche Option.

Gibt es ein Objekt mit Bezug auf vielleicht bereits vorhandenes Objekt Semantik in STL?

+9

Schließlich schließe ich, dass ich 'std :: optional >' für meine Zwecke verwenden kann. – Orient

Antwort

7

Als n3406 (Revision # 2 des Vorschlags) diskutiert wurde, fühlten sich einige Ausschussmitglieder mit optionalen Referenzen unwohl. In n3527 (Revision # 3) haben die Autoren beschlossen, optionale Referenzen zu einem Hilfsvorschlag zu machen, um die Wahrscheinlichkeit zu erhöhen, dass optionale Werte genehmigt und in C++ 14 übernommen werden. Obwohl das optionale Programm aus verschiedenen anderen Gründen nicht in C++ 14 aufgenommen wurde, hat das Komitee keine optionalen Referenzen abgelehnt und kann in Zukunft optionale Referenzen hinzufügen, sollte jemand dies vorschlagen.

0

Wenn ich eine Schätzung riskieren würde, wäre es wegen dieses Satzes in der Spezifikation von std :: experimental :: optional. (Abschnitt 5.2, p1)

Ein Programm, das die Instanziierung Vorlage optional für einen Referenztyp oder für gegebenenfalls cv qualifizierte Typen in_place_t oder nullopt_t ist schlecht gebildet erforderlich macht.

+2

Vielleicht ist es richtig, aber ich kann den Hintergrund der Schlussfolgerung nicht verstehen. – Orient

+0

@Orient, das für "' optional' standardisiert ist, darf nicht mit Referenzen und diesen beiden Sondertypen verwendet werden "- mit anderen Worten, es ist nicht dafür ausgelegt, mit ihnen zu arbeiten. Tatsächlich ist Ihre Frage ein anderes Mittel, um zu sagen: "Warum enthält der Standard diese Klausel?" –

+1

@ArneMertz Sie haben Recht, aber es ist wichtig, die Absichten des Empfängers zu verstehen. – Orient

4

Es ist in der Tat etwas, das Semantik Bezug auf vielleicht vorhandenes Objekt hat. Es heißt ein (const) Zeiger. Ein einfacher alter nicht-besitzender Zeiger. Es gibt drei Unterschiede zwischen Referenzen und Zeigern:

  1. Zeiger können Null sein, Referenzen können nicht. Dies ist genau der Unterschied, den Sie mit std::optional umgehen möchten.
  2. Zeiger können umgeleitet werden, um auf etwas anderes zu zeigen. Mach es const, und dieser Unterschied verschwindet auch.
  3. Referenzen müssen nicht durch -> oder * dereferenziert werden. Dies ist reiner syntaktischer Zucker und möglich wegen 1. Und die Pointer-Syntax (Dereferenzierung und Konvertierung in Bool) ist genau das, was std::optional bietet, um auf den Wert zuzugreifen und seine Anwesenheit zu testen.

Update: optional ist ein Container für Werte. Wie andere Container (vector, zum Beispiel) ist es nicht entworfen, um Referenzen zu enthalten. Wenn Sie eine optionale Referenz benötigen, verwenden Sie einen Zeiger, oder wenn Sie tatsächlich eine Schnittstelle mit einer ähnlichen Syntax wie std::optional benötigen, erstellen Sie einen kleinen (und trivialen) Wrapper für Zeiger.

Update2: Was die Frage warum gibt es keine solche Spezialisierung: weil der Ausschuss einfach es tat Opt-out. Die Begründung könnte irgendwo in den Zeitungen gefunden werden. Möglicherweise weil Zeiger als ausreichend angesehen wurden.

+10

Noch, für generische Programmierung möchten Sie 'std :: optional ' arbeiten, auch wenn 'T == U &'. Sie erklären recht gut, wie 'std :: optinal ' mit 'U * const' implementiert werden kann, aber das ist nicht wirklich eine Hilfe bei der generischen Programmierung. – MSalters

+2

@MSalters Ich sehe nicht, warum Sie das wollen. 'optional' ist ausschließlich für Werte. Siehe mein Update zur Antwort. "generische Programmierung" ist keine blanke Rechtfertigung, etwas Vorstellbares zu haben. Wenn Sie zufällig Gelegenheit haben, optionale Werte * und * optionale Referenzen zu unterstützen, verwenden Sie eine Spezialisierung, um distinguish zwischen 'optional' und Zeigern oder der von mir erwähnten Wrapper-Klasse zu unterscheiden. –