ホームページ >バックエンド開発 >C++ >std::vector で範囲ベースのループを使用するとコンパイラ エラーが発生するのはなぜですか?

std::vector で範囲ベースのループを使用するとコンパイラ エラーが発生するのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-26 06:05:31672ブラウズ

Why Does Using Range-Based Loops with std::vector Result in a Compiler Error?

Range-for-Loops と std::vector

C では、範囲ベースのループがその単純さと読みやすさから広く普及しています。これらはシーケンスまたはコンテナ オブジェクトの要素を繰り返し処理します。

しかし、std::vector で範囲ベースのループを使用しようとすると、興味深い不一致が発生します。次のコードは期待どおりに機能します。

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

std::vector で range-for-loops を使用します。コンパイラ エラーが発生します:

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

エラー メッセージ「型 'std::_Bit_iterator::reference {aka std の右辺値からの型 'std::_Bit_reference&' の非定数参照の初期化が無効です」 ::_Bit_reference}'" は、非 const 参照が右辺値で初期化されていることを示します。

問題の理解

この不一致の理由は、明確な相違点にあります。 std::vector の実装。各整数を個別に格納する std::vector とは異なり、 std::vector はビットパッキングを採用してメモリを節約します。したがって、その反復子は個々のブール値に直接アクセスせず、代わりに基になるビットにアクセスするプロキシとして機能する std::_Bit_reference への参照を返します。

解決策: auto&&&

を使用します。

この問題を解決するには、auto& の代わりに auto&&& を使用する必要があります。このイディオムは、左辺値 (最初の例の intVector など) が指定された場合、左辺値参照への参照を正しく折りたたむと同時に、(boolVector の場合のように) プロキシが指定された場合は、一時的なオブジェクトをバインドして維持します。

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

この手法を採用すると、std::vector を効果的に反復処理できます。範囲ベースのループを使用してその要素にアクセスします。

以上がstd::vector で範囲ベースのループを使用するとコンパイラ エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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