2017-01-01 8 views
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の仕組みの背景にある考え方は何ですか?それは私には本当に奇妙に思えるので。私が監督しているいくつかの落とし穴がありますか?

+1

をレイアウトされていますか? –

+0

根拠は、 'std :: optional'の祖先[' boost :: optional'](http://www.boost.org/doc/libs/1_61_0/libs/optional/doc/html/)を読んで見つけることができます。 index.html)。それらは、標準的なタイプに若干の変更が加えられているにもかかわらず、精神にはかなり近いです。 – StoryTeller

+0

@EdHeal私は私の比較を明確にしたと思った。どの部分を理解していないのですか?もちろん、それらは異なっていますが、オプションは常に、空のオブジェクトとしての "nullを渡す"パラダイムの現代版のように私に感じました。 –

答えて

1

C++標準ライブラリの投稿と同様に、std::optionalboostライブラリスイートからまっすぐ持ち上げられました。あなたはSTD `と`のstd :: optional`を比較しているのはなぜ:: unique_ptr`彼らは異なる獣がそうであるように

動機はhere

関連する問題