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

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

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-27 07:45:31463ブラウズ

Why Does Using a Range-Based For Loop With std::vector<bool> C でエラーが発生しますか? 
C でエラーが発生しますか? " />

Range-for-Loops と std::vector

C では、範囲ベースの for ループは、コンテナー内の要素を反復処理する便利な方法を提供します。ただし、ブール値のコンテナーで使用すると、特定の動作が驚くように見えるかもしれません。

問題

次のコードを考えてみましょう。

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

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

最初のループは、intVector とただし、2 番目のループでは次のエラーが発生します。

error: invalid initialization of non-const reference of type ‘std::_Bit_reference&’ from an rvalue of type ‘std::_Bit_iterator::reference {aka std::_Bit_reference}’
for (auto& i : boolVector)

理由

このエラーは、std::vector が他の標準コンテナと異なるために発生します。要素を個別のメモリ位置に保持する代わりに、ブール値を整数 (ブール値あたり 32 ビット) にパックします。その結果、その反復子は、ビット マスクを通じて個々のブール値へのアクセスを提供するプロキシ オブジェクトを返します。

解決策

std::vector を反復処理するには、正しい構文は auto&& を使用することです。これは、左辺値参照が指定されている場合はそれにバインドし、該当する場合は一時プロキシを維持します。 :

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

auto&& を使用すると、コンパイラは、真のブール値参照が指定された場合は左辺値参照に正しく折りたたまれ、プロキシへの参照が指定された場合は一時プロキシをバインドして存続させます。

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

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