2017-11-23 16 views
-2

は、私はユニークなポインタについて、次の質問を持っており、所有権移転 は、以下のユニークPTRとセマンティクスを移動

class Base 
{ 
    Base() 
    { 
    } 
    void foo(unique_ptr<Base> p) 
    { 
    } 
}; 
void main() 
{ 
    Base b; 
    b.foo(std::unique_ptr<Base> p(new Base); 
} 

を想定上記のコードセクションは、一時的なユニークなポインタを作成し、私はコンパイルエラーを期待しました。しかしコードはコンパイルされます。 私は唯一の有効な関数のプロトタイプは、私はそれをsurprizeと機能の2人の署名が有効である午前

void foo(unique_ptr<Base> && p) 

ことが期待。 rvalue参照を渡したときにvoid foo(unique_ptr p)が有効である理由を説明してください。 ありがとう

+1

括弧が一致していないため、コードがコンパイルされません。 –

答えて

0

std::unique_ptrにはrvalueコンストラクタがあります。したがって、rvalueから1つを作成できます。クラス型を引数として取る関数を呼び出すには、そのクラスに1引数の非明示的なコンストラクタがあり、呼び出しに渡されたパラメータからクラス型を構築できるが必要です。


これは、このような関数を呼び出すための唯一の方法ではありません。明示的な変換演算子を含む他の方法があります

関連する問題