2017-10-16 15 views
2

私は答えを探していましたが、私はそれを見つけることができません。だから私は具体的にここで質問をすることにしました。クラスメンバー内の値を移動する

struct NonCopyable 
{ 
    NonCopyable() { }; 
    NonCopyable(const NonCopyable& other) = delete; 
    NonCopyable(NonCopyable&& other) { }; 
}; 

struct Host 
{ 
    Host(NonCopyable&& nc) : m_nc(nc) { } 
    NonCopyable m_nc; 
}; 

は、この達成するために:私はこのようなものを使用しようとしている(と本契約の変異体)してきた

つまり

Host h(NonCopyable()); 

を、私は内部のコピー不可構築したいと思いますm_nc。これはすべて可能ですか? ncが名前付きパラメータとして左辺値であることを

+0

'm_nc'の中で' NonCopyable'を構築したいのであれば、それを 'm_nc'の内部で構築するのではなく、なぜパラメータとして渡すのですか?) – user463035818

+0

私はそれを外側。あなたは、私はそのコンストラクタのパラメータを渡し、それがHostの内部で構築されるべきであるということを意味しますか?次のようになります。 'Host():m_nc()? – racanu

+0

[メソッド定義の後のセミコロン](https://stackoverflow.com/a/5365656/211160)にいくつかの注意があります。 – HostileFork

答えて

4

注意は、あなたが例えば、右辺値に変換する必要がありますstd::move

Host(NonCopyable&& nc) : m_nc(std::move(nc)) { } 

EDIT

経由most vexing parse問題があります。 Host h(NonCopyable());は変数定義ではなく、関数宣言です。これはhという関数を宣言します。この関数はHostを返し、関数ポインタの型を持つ名前のないパラメータをとります(何も取らず、NonCopyableを返します)。

だけHost h{NonCopyable()};に変更します。

+0

はい、それも試しました。答えに影響を及ぼさないように投稿したくなかった。 – racanu

+1

@racanuあなたはそれを試した後、何が問題なのですか?それは不可能だと思いますか? – songyuanyao

+0

私はstd :: moveであっても、それは私が好きなように動作しないことを意味します。 '警告C4930: 'ホストh(NonCopyable(__cdecl *)(void))':プロトタイプ関数が呼び出されていない(変数定義が意図されていたか?)' コードが生成されていませんインスタンス化の行 – racanu

関連する問題