ホームページ >バックエンド開発 >C++ >要素は C の「initializer_list」から移動できますか?

要素は C の「initializer_list」から移動できますか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-18 17:14:14924ブラウズ

Can Elements Be Moved from a C   `initializer_list`?

セマンティクスと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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。