セマンティクスとInitializer_listを移動
Cでは、initializer_listこれは、T 型の値の一時的なシーケンスです。配列やその他のコンテナーを初期化するためによく使用されます。しかし、疑問が生じます: 要素は、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)); // Allowable?
}
}
ログイン後にコピー
答え:
残念ながら、initializer_list から要素を移動しています。意図したとおりに動作しません。移動されるまで、initializer_list が一時変数の配列を保持すると予想されているにもかかわらず、依然としてコピーが作成されます。
この逸脱は、initializer_list::begin() と initializer_list が同じであるという事実から生じます。 ::end() は const T * を返します。提供されたコードでの move の結果は、不変の右辺値参照を表す T const & && を生成します。このような表現からは動かせません。これは、型 T const & の関数パラメータにバインドされます。右辺値は const lvalue 参照にバインドされ、コピー セマンティクスの保持につながります。
この制限の背後にある理由は、コンパイラが initializer_list を初期化できるようにするためである可能性があります。 ;静的に。ただし、このアプローチは、コンパイラーが型を initializer_list として定義できるようにすることで改善できます。これにより、begin() と end() の結果の const または可変の性質に関するユーザーのあいまいさがなくなります。
それにもかかわらず、C 標準への拡張案が提案されています。この制限に対処し、initializer_list を許可します。移動のみのタイプをサポートします。まだ開発の初期段階にありますが、将来的にはこの機能がさらに検討され、採用されることが示唆されています。
以上が要素は C の「initializer_list」から移動できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。