初期化リストと移動セマンティクス: 要素を移動できますか?
初期化リストと移動セマンティクスの使用法に関して疑問が生じます。要素を 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)); // kosher? } }
ここでは、次のことが可能かどうかを確認したいと思います。要素を外に移動するstd::initializer_list.
答え
驚くべきことに、答えはノーです。式 std::move(*it) は移動にはなりません。代わりに、型 T const && の不変の右辺値参照を生成します。これは、initializer_list の begin メソッドと end メソッドが const T * を返し、移動セマンティクスが許可されないためです。
おそらく、コンパイラが静的に初期化された定数として initializer_list を作成できるようにするためです。ただし、コンパイラの裁量に応じて、begin と end が、initializer_list または const initializer_list を返すようにする方がより直観的です。
さらなる考慮事項
ISO 提案が作成されています。移動専用タイプのInitializer_listサポートを提供するために作成されました。この提案は、まだ初期段階ではありますが、ここで提起された問題に対処しています。
以上がstd::initializer_list から要素を移動できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。