Lambda函数从更高范围返回左值


int main() {
int x;
auto& getx = [&]() {
return x;
}

getx() = 1;
}

这似乎不可能,因为它给了我:

错误:无法绑定'main((::<类型的非常量左值引用;lambda((>amp;'转换为'main((::<lambda((>'|

为什么?以及如何做到

lambda表达式创建一个未知类类型的临时对象(称为闭包(。不能将临时对象分配给非常量引用。这意味着你需要
auto&& getx = [&]() {
return x;
}

这样你就可以得到一个对闭包的右值引用,或者

auto getx = [&]() {
return x;
}

所以你只是得到了结束。

这将获得要编译的代码,但仍然需要一个比特来使getx的返回值成为对x的引用。要做到这一点,你需要添加

auto getx = [&]() -> int& {
return x;
}
// or
auto getx = [&]() -> auto& {
return x;
}
// or
auto getx = [&]() -> decltype(auto) {
return x;
};

还要注意,main必须始终返回一个int。您应该提高编译器的警告级别,以便在尝试使用void main时出错。

您必须指定lambda返回对int-int&的引用,并通过():调用闭包

auto& getx = [&]() -> int& { // -> int& added
return x;
}();                         // () added

临时值不能绑定到左值引用。如果要使getx作为对x变量的引用,则必须从lambda返回引用。

最新更新