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

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

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-26 03:57:02908ブラウズ

Why Does Using a Range-Based For Loop on `std::vector` Cause an Error?

Range-for-Loops と std::vector

C では、範囲ベースの for ループにより反復が簡素化されます。コンテナ。ただし、これらのループを std::vector などの特定のコンテナ タイプで使用しようとすると、予期しない動作が発生する可能性があります。

次のコード スニペットを検討してください。

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

このコードintVector コレクションを反復処理し、各要素を出力します。ただし、 intVector を std::vector に置き換えます。 boolVector:

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

この変更されたコードによりエラーが発生します:

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}’

基礎となるメカニズム:

std:: により矛盾が生じます。ベクトル他のベクトル型とは動作が異なります。ほとんどの std::vector バリエーションでは、反復子は要素型の参照を指し、auto& を介した直接アクセスと変更が可能です。ただし、これは std::vector には当てはまりません。

std::vectorブール値を整数にパックすることで効率的に格納します。その結果、イテレータはビット操作を実行してブール値を取得する特別なプロキシ オブジェクトを返します。このプロキシは右辺値 (一時) であり、左辺値参照 (auto&) にバインドできません。

解決策:

これを解決するには、範囲内で auto&&& を使用します。 -based ループ:

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

auto&&& 構文は反復子参照の型をチェックします。左辺値参照の場合は、同じままです。それ以外の場合は、一時プロキシにバインドして保存し、コードが正しく実行できるようにします。

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

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