#include <bits/stdc++.h>
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 arr[0][0] == true
正在返回 1
,这是预期的。
有人可以解释一下这背后的问题吗?
arr[0][0]
的类型是bool&
,因此它被推导为 lambda 的返回类型。因此,您的 lambda 返回对局部变量 arr
中的元素的悬空引用。在lambda 之外使用此引用具有未定义的行为。
您可以通过明确声明返回类型不是引用来解决此问题:
auto get = [&]() -> bool {
令人惊讶的是,
std::vector<bool>
的行为方式与 std::vector
的其他专业化并不完全相同。 std::vector<bool>
打包它的数据,以便它可以将每个元素存储为单个位。因此,operator[]
返回一个引用对象,该对象引用向量中的一小块内存。
您从函数中返回的就是这个引用。由于它是对向量的引用,并且向量现在已经消失,因此您有一个悬空引用,并且访问它具有未定义的行为。