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?
gelegt Warum Sie mit '' std std :: optional' vergleichen :: unique_ptr', da sie unterschiedliche Tiere sind? –
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
@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". –