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

Linda Hamilton
リリース: 2024-10-27 07:45:31
オリジナル
462 人が閲覧しました

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!