C++ 中布尔 lambda 的奇怪行为

问题描述 投票:0回答:2
#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
,这是预期的。

有人可以解释一下这背后的问题吗?

c++ visual-c++ lambda
2个回答
0
投票

arr[0][0]
的类型是
bool&
,因此它被推导为 lambda 的返回类型。因此,您的 lambda 返回对局部变量
arr
中的元素的悬空引用。在lambda 之外使用此引用具有未定义的行为。

您可以通过明确声明返回类型不是引用来解决此问题:

auto get = [&]() -> bool {

0
投票

令人惊讶的是,

std::vector<bool>
的行为方式与
std::vector
的其他专业化并不完全相同。
std::vector<bool>
打包它的数据,以便它可以将每个元素存储为单个位。因此,
operator[]
返回一个引用对象,该对象引用向量中的一小块内存。

您从函数中返回的就是这个引用。由于它是对向量的引用,并且向量现在已经消失,因此您有一个悬空引用,并且访问它具有未定义的行为。

© www.soinside.com 2019 - 2024. All rights reserved.