ホームページ >バックエンド開発 >C++ >Range-for-Loop で `auto&` を `std::vector` とともに使用できないのはなぜですか?

Range-for-Loop で `auto&` を `std::vector` とともに使用できないのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-27 05:28:03652ブラウズ

Why Can't I Use `auto&` with `std::vector` in a Range-for-Loop?

Range-for-Loops with std::vector

C では、range-for-loops は反復処理によく使用されます。 STLコンテナ上。ただし、このアプローチを std::vector で使用しようとすると、エラーが発生する可能性があります。

次のコード スニペットを考えてみましょう:

<code class="cpp">std::vector<int> intVector(10);
for(auto& i : intVector)
    std::cout << i;</code>

このコードは、std:: :vector int& を逆参照するイテレータを持つコンテナです。これは、反復子の逆参照値を独自の左辺値参照 auto& にバインドできることを意味します。

ただし、std::vector で同じ操作を実行しようとすると、エラーが発生します。以下に似ています:

<code class="cpp">std::vector<bool> boolVector(10);
for(auto& i : boolVector)
    std::cout << i;</code>

これは、std::vector が原因です。は従来の意味でのコンテナではなく、ビットセットです。複数のブール値を表す整数を使用して、ブール値をパックされた方法で格納します。その結果、その反復子は bool& の代わりに Proxy オブジェクトを返します。

プロキシは、左辺値参照にバインドできない一時オブジェクトです。これが、上記の range-for ループで auto& を使用できない理由です。代わりに、auto&& を使用する必要があります。これは、左辺値参照が指定されている場合は正しくバインドし、プロキシが指定されている場合は一時プロキシを有効に維持します。修正されたコードは次のとおりです:

<code class="cpp">for(auto&& i : boolVector)
    std::cout << i;</code>

以上がRange-for-Loop で `auto&` を `std::vector` とともに使用できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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