Can I Move Elements from std::initializer_list?
std::initializer_list を使用する場合、要素を移動できると考えるのが論理的ですそれから。ただし、次のコードはそうでないことを示しています。
#include <initializer_list> #include <utility> template<typename T> void foo(std::initializer_list<T> list) { for (auto it = list.begin(); it != list.end(); ++it) { bar(std::move(*it)); // Safe? } }
予想に反して、要素を std::initializer_list から移動しようとすると、代わりにコピーが作成されます。これは、特殊なコンパイラ処理が必要であり、一般的なコンテナの値セマンティクスが欠けている std::inializer_list の独特の性質により発生します。
問題は、std の begin() と end() の戻り値の型にあります。 ::initializer_list、const T 。したがって、式 'std::move(it)' は不変の右辺値参照 (T const &&&) を生成しますが、これは事実上移動できません。これは単に T const & 型の関数パラメータにバインドするだけです。右辺値が const lvalue 参照にバインドされ、結果としてコピー セマンティクスが発生するためです。
この動作は直観に反しているように思えるかもしれませんが、これによりコンパイラは潜在的に initializer_list を静的に-初期化された定数。それにもかかわらず、begin() と end() の結果が const か mutable であるかについてユーザーが不確かなままになるという不一致が生じます。
以上が`std::initializer_list` から要素を移動できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。