C では、範囲ベースのループがその単純さと読みやすさから広く普及しています。これらはシーケンスまたはコンテナ オブジェクトの要素を繰り返し処理します。
しかし、std::vector
<code class="cpp">std::vector<int> intVector(10); for(auto& i : intVector) std::cout << i;</code>
std::vector
<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
解決策: auto&&&
を使用します。この問題を解決するには、auto& の代わりに auto&&& を使用する必要があります。このイディオムは、左辺値 (最初の例の intVector など) が指定された場合、左辺値参照への参照を正しく折りたたむと同時に、(boolVector の場合のように) プロキシが指定された場合は、一時的なオブジェクトをバインドして維持します。
<code class="cpp">for(auto&& i : boolVector) std::cout << i;</code>
この手法を採用すると、std::vector
以上がstd::vector で範囲ベースのループを使用するとコンパイラ エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。