指向 std::vector 元素时编译器错误<bool>?
compiler error when pointing to an element of std::vector<bool>?
尝试使用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 *
而代码板(见 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
在内部是相同的(只是一个 1 字节的类型,有一些编译器的东西来强制执行bool
只允许真/假值)。但我没想到会有这样的问题!知道为什么吗?!
请注意,我知道位集,但对在这里使用它们不感兴趣。
是的,bool
和unsigned char
通常自己占用相同数量的内存,但这并不能使vector<bool>
和vector<unsigned char>
相同!
标准对vector<bool>
进行了非常非常特殊的处理,以便尽可能接近地打包元素(1990 年代有人认为这会很聪明,因为bool
只有两种状态之一),结果就是你所看到的:它的元素是不可寻址的。
避免!
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- EASTL矢量<向量<int>>连续的
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- ///<评论></评论>在Visual Studio中