4

次のコードでは:

class SomeClass {
    vector<int> i;
    vector<bool> b;

public:
    int& geti() {return i[0];}
    bool& getb() {return b[0];}
};

コメントアウトするgetb()と、コードは正常にコンパイルされます。どうやら、ベクトルに格納されているへの参照を返すのに問題intはないようですが、でそれを行うことはできませんbool

どうしてこれなの?

4

2 に答える 2

11

std::vector<bool>「特別」です。要素をビット配列として格納します。つまり、要素を個別にアドレス指定することはできず、要素への参照を取得することはできません。

std::vector<bool>イテレータ、そのoperator[]、およびその他のメンバー関数は、実際のオブジェクトを格納することなく要素へのアクセスを提供するプロキシオブジェクトを返します。bool

個々の要素にアクセスできるようにする必要がある場合は、a (または、符号が気になる場合はaまたは、)で裏打ちされた-のような列挙を使用std::vector<char>または定義することを検討してください。boolcharsigned charunsigned char

于 2012-07-02T02:32:44.687 に答える
2

vector < bool >は、 bool型に特化した特別なクラステンプレートです。

この特殊化は、スペース割り当てを最適化するために提供されています。8つのbool要素が1バイトに結合され、各bool要素は1ビットのみを占有します。

特定の1バイトの1ビットへの参照は許可されていません。

そのため、関数はvector< bool >のbool型への参照を返すことができませんでした。

また、vector< bool >はコンテナではないと考える人もいます。

代わりにdeque< bool >を使用できます。

于 2012-07-02T02:40:12.770 に答える