指向std :: vector <bool>?</bool>的元素时出现编译器错误

时间:2014-01-13 23:53:47

标签: c++ vector

尝试使用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.

我认为boolunsigned char内部都是相同的(只有一个字节类型,一些编译器强制执行bool只允许true / false值)。但我没想到会有这样的问题!知道为什么吗?!

请注意,我知道bitsets并且对此处使用它们不感兴趣。

1 个答案:

答案 0 :(得分:5)

是的,boolunsigned char通常会自行获取相同数量的内存,但这不会使vector<bool>vector<unsigned char>相同!

vector<bool>被标准给予了非常非常的特殊处理,以便尽可能地收集元素(20世纪90年代的某个人认为这将是聪明的,因为{{1}只有两种状态之一),结果就是你所看到的:它的元素是不可寻址的。

避免!