ホームページ >バックエンド開発 >C++ >`std::initializer_list` から要素を移動できますか?

`std::initializer_list` から要素を移動できますか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-26 17:02:13669ブラウズ

Can I Move Elements from a `std::initializer_list`?

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 サイトの他の関連記事を参照してください。

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