2017-01-01 7 views
0

Für mich war std::optional<T> immer eine "reinere" Version von std::unique_ptr<T>: beide haben einen leeren Zustand (optional() und nullptr) und besitzen ansonsten ein T Objekt. Diese Analogie bricht jedoch bei Betrachtung std::optional<const T> zusammen. Der erste Codeblock ist gültig, während der zweite Codeblock nicht gültig sein sollte, da der Typ (const T) MoveAssignable sein muss.Was ist der Grund für std :: optional?

std::unique_ptr<const int> ptr1, ptr2; 
ptr1 = std::move(ptr2); 

std::optional<const int> opt1, opt2; 
opt1 = std::move(opt2); 

Mit einer ähnlichen Argumentation, würde ich erwarten, std::optional<T&> zu einem nicht-besitzenden Zeigern T* äquivalent. Während diese Analogie für allgemeine T ein wenig verschwommen ist, denke ich, dass es für const T viel Sinn ergeben würde.

const int ZERO = 0; 

void AssignPtrIfNull(const int*& ptr) { 
    ptr = (ptr == nullptr ? &ZERO : ptr); 
} 

void AssignOptIfNull(std::optional<const int&>& ptr) { 
    ptr = (ptr ? make_optional<const int&>(ZERO) : ptr); 
} 

Also ich frage mich, was ist der Denkprozess optional hinter machen, wie es ist? Weil es mir wirklich komisch vorkommt. Gibt es einige Fallstricke, die ich überwache?

+1

gelegt Warum Sie mit '' std std :: optional' vergleichen :: unique_ptr', da sie unterschiedliche Tiere sind? –

+0

Rationale kann gefunden werden, indem man über 'std :: optional's Vorfahr [' boost :: optional] liest (http://www.boost.org/doc/libs/1_61_0/libs/optional/doc/html/ index.html). Sie sind dem Geist ziemlich nahe, obwohl der Standardtyp einige kleine Änderungen aufweist. – StoryTeller

+0

@EdHeal Ich dachte ich habe meinen Vergleich klar gemacht; Welchen Teil verstehst du nicht? Natürlich sind sie unterschiedlich, aber für mich immer das Gefühl einer modernen Version des Paradigmas "pass null als leeres Objekt". –

Antwort

1

Wie alles in der C++ - Standard-Bibliothek nach C++ 11, std::optional wurde direkt aus der boost Bibliothek Suite gehoben.

ist die Motivation here

Verwandte Themen