vector<bool> 编译失败

本文探讨了C++中vector<bool>类型的特殊行为及由此引发的编译错误。通过实例说明了vector<bool>元素大小并非预期的1字节,并解释了为何不能将其元素作为引用传递的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

你可能在写如下代码时,出现编译错误的问题:

int main(int argc,char** argv)
{
    std::vector<bool> v_bool(2);
    for(auto& item : v_bool)
        item = false;
    return 0;
}

错误信息如下:

error: invalid initialization of non-const reference of type ‘std::_Bit_reference&’ from an rvalue of type ‘std::_Bit_iterator::reference {aka std::_Bit_reference}’
     for(auto& item : v_bool)

理解起来就是vector_bool不能用来做左值。为什么 vector_int都可以,而vector_bool不行呢?你可以百度更多的信息,或者查看C++ 的reference来得到答案。这里,我只是总结一点踩过的坑。
你一定知道一般来说int是4字节,bool是1字节,即

sizeof(int) == 4;
sizeof(bool) == 1;

但是如果是这样的呢:

std::vector<bool> v_bool(2);
std::vector<int> v_int(2);

sizeof(v_bool[0]) == ?;
sizeof(v_int[0]) == ?;

如果你写一个小程序测试就会发现

sizeof(v_bool[0]) == 16;
sizeof(v_int[0]) == 4;

是不是很奇怪,那如果你有一个函数fun,形参是bool&,那么,传入v_bool[0]将出现错误。

void fun(bool& use_huber)
{
    use_huber = true;
}
fun(v_bool[0])//something is wrong

所以,为了给自己少挖坑,尽量少使用vector (其实使用vector也不能带来内存空间的节省效果),而用vector代替。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值