2011-11-30 3 views
6

boolのベクトルの要素のアドレスにアクセスしている間だけ、警告を受けています。 intのような他のデータ型のベクトルについては、何の警告も出ません。ベクトル内の要素のアドレスにアクセスしている間に一時的なアドレスを取る<bool>

例えば

vector<bool> boolVect; 
boolVect.push_back(false); 
if (boolVect.size() > 0) { 
    cout << &boolVect[0] << endl; 
} 

私は声明で、 "一時的のアドレスを取って" 警告を受ける "< < & boolVect [0] < <てendl COUT;"
誰かが明確にしてもらえますか?

+2

代わりに '' deque ''を試してみてください。期待どおりに動作するはずです。 – fschoenm

答えて

13

std::vector<bool>が壊れています(例:http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=98またはAlternative to vector<bool>を参照)。 std::vector<T>の特殊化ですが、個々の要素はパックされたビットとして格納されます。したがって、個々の要素のアドレスを取得することはできません。したがって、それは本当に迷惑です。

+2

はい、_broken_は正しい用語です。 –

+0

私はテンプレートクラスを持っています。 「ベクトル vect」とアクセスアドレス(&vect [i])を使用します。ここではT = boolのコンパイル時の警告が出ます。 T = boolの場合、アドレスにアクセスしていない場合、この警告を取り除くにはどうすればよいですか? – Rahul

+0

@Rahul(あなたが投稿してから長い時間ですが、それでも...)boolのテンプレート専門化はできますか?要素のアドレスを取らないように、boolの実装を変更することができます。 – Daryn

3

vector<bool>は、標準vectorのテンプレート特殊化である。通常の実装では、スペースを節約し、すべてboolは1ビットしかかかりません。便宜上、一時的なオブジェクトを単一のビットの参照として取得し、それ以外の方法では対処できません。

関連する問題