0
私には、std::optional<T>
は常にstd::unique_ptr<T>
の「クリーナー」バージョンでした。どちらも空の状態(optional()
とnullptr
)で、それ以外の場合はT
オブジェクトを所有しています。しかし、この類推は、std::optional<const T>
を考えると分解されます。最初のコードブロックは有効ですが、2番目のコードブロックは有効ではありません。タイプ(const T
)はMoveAssignableである必要があります。同様の推論で std :: optionalの背後にある根拠は何ですか?
std::unique_ptr<const int> ptr1, ptr2;
ptr1 = std::move(ptr2);
std::optional<const int> opt1, opt2;
opt1 = std::move(opt2);
、私は
std::optional<T&>
は非所有ポインタ
T*
と同等であることが期待されます。この類推は一般的に
T
の場合は少しぼやけていますが、私は
const T
にはかなり意味があると思います。
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);
}
だから、optional
の仕組みの背景にある考え方は何ですか?それは私には本当に奇妙に思えるので。私が監督しているいくつかの落とし穴がありますか?
をレイアウトされていますか? –
根拠は、 'std :: optional'の祖先[' boost :: optional'](http://www.boost.org/doc/libs/1_61_0/libs/optional/doc/html/)を読んで見つけることができます。 index.html)。それらは、標準的なタイプに若干の変更が加えられているにもかかわらず、精神にはかなり近いです。 – StoryTeller
@EdHeal私は私の比較を明確にしたと思った。どの部分を理解していないのですか?もちろん、それらは異なっていますが、オプションは常に、空のオブジェクトとしての "nullを渡す"パラダイムの現代版のように私に感じました。 –