範囲ベースの For ループが「std::vector」で異なる動作をするのはなぜですか?

DDD
リリース: 2024-10-30 04:06:02
オリジナル
948 人が閲覧しました

Why Do Range-Based For Loops Behave Differently with `std::vector`?

Range-for-Loops と std::vector

標準ライブラリ コンテナーで範囲ベースの for ループを使用する場合、多くの場合、イテレータのデータ型によってカウンタ変数のデータ型が決まります。ただし、std::vector の場合は、その基礎となるストレージ メカニズムにより独特の動作が発生します。

最初の例:

<code class="cpp">std::vector<int> intVector(10);
for (auto& i : intVector)
    std::cout << i;</code>
ログイン後にコピー

The std::vector< ;int>には整数が含まれているため、反復子の型は std::vector::iterator になります。この反復子は T& (この場合は int&) を逆参照し、int& 型のカウンタ変数を作成します。

次に、2 番目の例を考えてみましょう。

<code class="cpp">std::vector<bool> boolVector(10);
for (auto& i : boolVector)
    std::cout << i;</code>
ログイン後にコピー

ここで、std は次のとおりです。 :vector整数パック形式で格納されるブール値が含まれます。イテレータの型は std::vector::iterator で、std::vector::reference (std::_Bit_reference とも呼ばれます) を逆参照します。この参照型は右辺値 (一時的) であり、非 const 参照にバインドできません。これにより、コンパイル エラーが発生します:

<code class="text">invalid initialization of non-const reference of type ‘std::_Bit_reference&amp;’ from an rvalue of type ‘std::_Bit_iterator::reference {aka std::_Bit_reference}’</code>
ログイン後にコピー

解決策は、左辺値参照の場合は左辺値参照にバインドする auto&& を使用することです。一時的な場合は右辺値の一時コピーを作成します。

<code class="cpp">for (auto&& i : boolVector)
    std::cout << i;</code>
ログイン後にコピー

この変更により、コードは期待どおり boolVector の内容を出力します。

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

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