尝试使用std::vector<bool>
我有一个令我非常惊讶的编译器错误。
简而言之,取一个std::vector<unsigned char>
元素的地址并将其分配给unsigned char
指针:
std::vector<unsigned char> test(10);
unsigned char *pb = &test[0];
效果非常好,而尝试使用std::vector<bool>
执行同样的操作会导致编译器错误:
int main() {
std::vector<bool> test(10);
bool *pb = &test[0]; // line 4, compile error
return 0;
}
在Visual Studio上,它表示如下:
std::vector bool cannot convert std::_Vb_reference<_Alloc> * to bool *
虽然键盘(see example at http://codepad.org/vaiN3iEq)说:
cc1plus: warnings being treated as errors
In function 'int main()':
Line 4: warning: taking address of temporary
Line 4: error: cannot convert '__gnu_norm::_Bit_reference*' to 'bool*' in initialization
compilation terminated due to -Wfatal-errors.
我认为bool
和unsigned char
内部都是相同的(只有一个字节类型,一些编译器强制执行bool
只允许true / false值)。但我没想到会有这样的问题!知道为什么吗?!
请注意,我知道bitsets并且对此处使用它们不感兴趣。
答案 0 :(得分:5)
是的,bool
和unsigned char
通常会自行获取相同数量的内存,但这不会使vector<bool>
和vector<unsigned char>
相同!
vector<bool>
被标准给予了非常非常的特殊处理,以便尽可能地收集元素(20世纪90年代的某个人认为这将是聪明的,因为{{1}只有两种状态之一),结果就是你所看到的:它的元素是不可寻址的。
避免!