あなたがタイプstd::vector<std::string>
の変数を持っていて、初期化子リストで初期化しましょう:initializer_listの要素を移動するにはどうすればよいですか?
using V = std::vector<std::string>;
V v = { "Hello", "little", "world", "of", "move", "semantics" };
コンパイラは、リテラル文字列ごとに一時的std::string
を作成し、これらを介して初期化子リストを作成し、ctorのを呼び出しますV
の場合はベクターを作成します。 ctorはすべての文字列が一時的な文字列であることを知らないので、各文字列をコピーしています。
標準で、ベクトルctorが一時的なときに要素を移動させることができないものは見つかりませんでした。
何か不足していますか、イニシャライザリストを使用して不要なコピーが作成されていますか?私はこの問題が著しく非効率的なコードにつながるクラスを書いています。不必要なコピーを避けるための技術は、非常に高く評価されます。標準は、実際の引数として中括弧初期化子から、初期化子リストの引数を取るコンストラクタの呼び出しを定義するため、次のように
良い質問。私はイニシャライザのリストがもともとテンポラリのシーケンスを渡して何かをすることを意図したものではないと思う。しかし今では、イニシャライザーリスト変数を宣言できます。このような長命のリストの各項目の内臓を吸うベクトルのためにはないでしょう。しかし、待って、初期値リストにrvalue refを持つコンストラクタ。多分? –
@ Cheersandhth.-Alf私はconst-ref、non-const-ref、rvalue-refで初期化子リストをオーバーロードすることができると思います。次に、要素をrvalue-ref初期化子リストから手動で移動することができます。洗練されていないし、私は現在、基になるストレージ(ベクトルとマップ)として使用しているSTLコンテナで動作しませんが、何よりも優れています。ありがとう。 –
[initializer \ _listとmove semantics]の複製(https://stackoverflow.com/questions/8193102/initializer-list-and-move-semantics) –