C++中vector<bool>结合Lambda的异常行为问题
问题原因解析
先看这段代码的现象:
#include <iostream> #include <vector> using namespace std; int main() { int n = 4, m = 3; auto get = [&]() { vector<vector<bool>> arr(n, vector<bool>(m, false)); arr[0][0] = true; return arr[0][0]; }; cout << get() << endl; }
这段代码运行后输出0,但将return语句修改为return arr[0][0] == true时,输出符合预期的1。背后的原因如下:
vector
的特殊性 :vector<bool>是C++标准库中一个特殊的容器,它并非真正存储bool类型元素,而是做了空间优化——用单个比特位存储每个"bool"值。为了实现这种比特位访问,vector<bool>::operator[]返回的不是bool类型,而是一个名为vector<bool>::reference的代理对象,这个对象负责操作对应的比特位。悬空代理对象导致未定义行为:lambda里的
arr是局部变量,当lambda执行完毕返回时,arr会被销毁,其占用的内存被释放。此时返回的arr[0][0]是绑定到已销毁容器的代理对象,属于悬空引用。访问这个悬空代理对象的行为是未定义行为,输出0只是不确定结果中的一种。表达式转换的作用:当修改为
return arr[0][0] == true时,arr[0][0]的代理对象会参与比较运算,此时会触发隐式转换,从代理对象中提取出实际的bool值(也就是我们设置的true),返回的是合法的bool类型值,所以输出符合预期的1。
内容的提问来源于stack exchange,提问作者starboy_jb
相关产品推荐
相关产品推荐

