は、標準、std::optional<T>
のコピーコンストラクタによると:削除されたようis_copy_constructible_v<T>
がtrue
でない限りTがmove-constructibleでないときに、std :: optionalのmove-constructorが削除されないのはなぜですか?
...定義されなければなりません。
しかしstd::optional<T>
の移動-コンストラクタ:is_move_constructible_v<T>
がtrue
でない限り
...オーバーロードの解決に参加してはなりません。
I understand deleted constructors、std::optional<T>
の移動-コンストラクタは、このようなコードできるようになり、削除ではないことを目的として:
std::optional<X> o1;
std::optional<X> o2(std::move(o1));
が...いくつかの変換シーケンスに頼って仕事をする - o2
うstd::optional<X>&&
(私が間違っている場合は私を修正してください)を使用して構築されたタイプA
のオブジェクトで構築されます。
しかしT
がある場合std::optional
の可能コンストラクタについて、私はつらい時、このユースケースに一致する可能性がものを考え出すを持っている...
はなぜstd::optional<T>
の動き-コンストラクタは単にはを削除されません動くことはありませんか?明示的にコピーコンストラクタは、これらの例を取るという よりも、それはそれは x値のための最高の試合になるので、コンパイル時エラーになりますことを意味し削除するには
したがって、 'T'がコピー可能だが移動不可能な場合は、x値から' optional'を構築することができますか? – Holt
@Holt:正確に。 – sp2danny
'T'がmove-constructibleでない場合、move-constructorをオーバーロード解決から除外するように宣言する必要がありますか? '= default'ですか? –