lambda表达式创建一个未知类类型的临时对象(称为闭包(。不能将临时对象分配给非常量引用。这意味着你需要
int main() {
int x;
auto& getx = [&]() {
return x;
}
getx() = 1;
}
这似乎不可能,因为它给了我:
错误:无法绑定'main((::<类型的非常量左值引用;lambda((>amp;'转换为'main((::<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返回引用。