2016-07-28 3 views
1

私は、オブジェクトに固有のポインタを保持するconst vectorメンバを持つクラスを持っています。構築されると、sequenceオブジェクトは、コンストラクタに渡される一意のポインタのベクトルの所有権を奪って、シーケンスオブジェクトが現在、ベクトルパラメータの一意のポインタによって所有されていたオブジェクトの所有者になるようにする必要があります。C++ constベクトルメンバのイニシャライザリストにラムダを埋め込みました

class sequence 
{ 
    const std::vector< std::unique_ptr<statement> > m_statements; 

    sequence(std::vector< std::unique_ptr<statement> > & statements); 
}; 

私はコンストラクタを実装しようとした最初の時間は、私は次のようでした:

sequence::sequence(vector< unique_ptr<statement> > & statements) 
    m_statements(statements) 
{ 
} 

しかし、もちろん1はunique_ptrを構築し、コピーして、これができないことができるので、これはコンパイルされません」コピーはvectorです。

C++では、コンストラクタの本体で(Javaが最終メンバーで行うように)初期化子リスト内でのみconstメンバーを初期化できません。したがって、const修飾子をm_statementにドロップし、ループを使用して、コンストラクタの本体で1つのベクトルから別のベクトルへコンテンツを移動することが考えられます。

しかし、私はこれを維持したいconst修飾子。

私はコンパイルしているようだが、私がC++ 11を新しく使ったので、それがどういうことをしているのか分からない。ループを使用してイニシャライザリスト内でm_statementを初期化しても、const修飾子をm_statementに保持できるように、上記のループをラムダ関数に埋め込むことでした。

sequence::sequence(vector< unique_ptr< const statement > > & statements) : 
    m_statements(([ & statements ] { 
     vector< unique_ptr< const statement > > copied_vec; 
     for(auto & stm : statements) 
      copied_vec.push_back(move(stm)); 
     return copied_vec; 
    })()) 
{ 
} 

これはコンパイルされます。しかし、ラムダ関数のreturn文で何が起きるのか分かりません。

私はcopied_vecのコピーが作成され、返されたと仮定します。ユニークなポインタのベクトルを値で返すとどうなりますか?奇妙なことにもかかわらず、私が欲しいことをする正しい方法ですか、またはちょうどconst修飾子をm_statetentに置かなければなりませんか?ありがとうございました。

+1

は(あなたのコードがどのように動作するかについての質問に答えるが、[この]ありませんhttp://stackoverflow.com/questions/18282204/proper-way-of-transferring-ownership-of-a-stdvector- stdunique-ptr-int-t)は、ベクトルを '移動する '正しい方法を示しています。 – NathanOliver

+0

ラムダを作成して呼び出します。賢明ではありますが、不要です。 – lorro

+0

@ NathanOliverありがとうございます。私はそれがいかに単純かを見るために言葉がありません。 – Virus721

答えて

6

移動コンストラクタを使用できない理由がありません。

sequence::sequence(vector< unique_ptr<statement> > && statements) 
    m_statements(std::move(statements)) 
{ 
} 
+0

ご協力ありがとうございます。私はちょうどそれについて考えなかった。私は 'copied_vec'を値で返すことによってコピーしているときに何が起こるか知りたいですが。 – Virus721

+0

「詳細」に応じて、あなたはある種のRVOを取得する可能性が高いと思います。私はC++ 17で、それも(詳細に応じて)義務付けさえあると思います。 – KayEss

+0

ありがとうございます。しかし、暗黙のコンパイラ最適化を無視して、ユニークなポインタのベクトルをコピーするとどうなりますか?所有権は、ソースベクトルのポインタから新しく生成されたベクトルのポインタに転記されますか? – Virus721

関連する問題