7

重複の可能性:
なぜ vector<bool>::reference は bool への参照を返さないのですか?

以前は、アクセスしたアイテムのディープstd::vector::operator[]コピーが取得されると考えていましたが、必ずしもそうではないようです。少なくとも、次のテスト コードでは異なる結果が得られます。vector<bool>

#include <iostream>
#include <vector>
using namespace std;

template <typename T>
void Test(const T& oldValue, const T& newValue, const char* message)
{
    cout << message << '\n';

    vector<T> v;
    v.push_back(oldValue);
    cout << " before:  v[0] = " << v[0] << '\n';

    // Should be a deep-copy (?)       
    auto x = v[0];   
    x = newValue;

    cout << " after:   v[0] = " << v[0] << '\n';
    cout << "-------------------------------\n";
}

int main()
{
    Test<int>(10, 20, "Testing vector<int>");
    Test<double>(3.14, 6.28, "Testing vector<double>");
    Test<bool>(true, false, "Testing vector<bool>");
}

出力 (VC10/VS2010 SP1 でコンパイルされたソース コード):

Testing vector<int>
 before:  v[0] = 10
 after:   v[0] = 10
-------------------------------
Testing vector<double>
 before:  v[0] = 3.14
 after:   v[0] = 3.14
-------------------------------
Testing vector<bool>
 before:  v[0] = 1
 after:   v[0] = 0
-------------------------------

v[0] 代入後x = newValue以前の値と同じになると予想していましたが、そうではないようです。何故ですか?なぜvector<bool>特別なのですか?

4

3 に答える 3

20

vector<bool>恐ろしい忌まわしさと特別です。委員会はそれをビットのパックに特化したため、ビットを参照できないため、適切な参照セマンティクスをサポートしていません。これは、準拠していないインターフェイスを持ち、実際には標準コンテナーとしての資格がないことを意味します。ほとんどの人が使用する解決策は、vector<bool>.

于 2013-01-30T11:58:26.673 に答える
6

vector<bool>::operator[]boolaも a への参照も生成しませんbool参照のように機能する小さなプロキシ オブジェクトを返すだけです。これは、単一ビットへの参照がなく、vector<bool>実際にはbools が圧縮された方法で格納されるためです。したがって、使用autoすることで、その参照のようなオブジェクトのコピーを作成しただけです。問題は、C++ がこのオブジェクトが参照として機能することを認識していないことです。に置き換えautoて、ここで「値への減衰」を強制する必要がありますT

于 2013-01-30T12:03:50.870 に答える
4

operator[]は、参照プロキシを指定する以外のT&for のすべての値を返します。Herb Sutter によるこの古いコラムを参照して、ジェネリック コードでの使用がなぜ悪い考えなのか (そしてなぜそれがコンテナーでさえないのか) について説明してください。Scott Meyers によるEffective STL には、それに関する特別な項目もあり、ここ SO にはたくさんの質問があります。Tboolvector<bool>

于 2013-01-30T12:01:09.133 に答える