文と暗黙のムーブと型変換の関係についてメモ。文にて型変換(unique_ptr→shared_ptr)を伴う場合、C++11/14言語仕様によって振る舞いが異なる。C++11:変数型と戻り値型が異なる場合、右辺値(rvalue)版のオーバーロード選択は試行されない。unique_ptr型の左辺値(lvalue)をとるshared_ptrコンストラクタは存在せず、該当コードはill-formedとなる。文に変数名のみを記述した場合*2、最初に右辺値(rvalue)版のオーバーロード選択が試行される。この結果unique_ptr型の右辺値(rvalue)をとるshared_ptrコンストラクタが選択され、該当コードはwell-definedとなる。C++11/14によらず、func_explicit_move関数のように明示的な右辺値キャスト(std::move(p))を行えばwell-formedとなる。3.8.0(-std=c++14)現在もコンパイルエラーとなる。対象基準に等しいため、変数型と戻り値型が一致している必要がある。12.8/p31-32より一部引用(下線部は強調)。対象基準とは別に、右辺値(rvalue)オーバーロード試行要件が定義されている。12.8/p32より一部引用(下線部は強調)。対象基準(12.8/p31)はC++11仕様と同一。(snip)ノート:あくまでもソースコード上での右辺値キャスト明示有無の問題であり、func_implicit_move関数とfunc_explicit_move関数で呼び出されるコンストラクタの回数および種別は等しい。無効ならば、関数内で2回のコンストラクタshared_ptr(unique_ptr&&)→shared_ptr(shared_ptr&&)が呼び出される。本文末尾のノートも参照のこと。r284303)ならばC++14仕様通りコンパイルが通る。1注目記事はてなブログをはじめよう!yohhoyさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。