私は、オブジェクトに固有のポインタを保持する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
に置かなければなりませんか?ありがとうございました。
は(あなたのコードがどのように動作するかについての質問に答えるが、[この]ありませんhttp://stackoverflow.com/questions/18282204/proper-way-of-transferring-ownership-of-a-stdvector- stdunique-ptr-int-t)は、ベクトルを '移動する '正しい方法を示しています。 – NathanOliver
ラムダを作成して呼び出します。賢明ではありますが、不要です。 – lorro
@ NathanOliverありがとうございます。私はそれがいかに単純かを見るために言葉がありません。 – Virus721