Lambda 函数从更高范围返回左值
Lambda function returning lvalue from higher scope
int main() {
int x;
auto& getx = [&]() {
return x;
}
getx() = 1;
}
这似乎不可能,因为它给了我:
错误:无法将 'main()::<lambda()>&' 类型的非常量左值引用绑定到 'main()::<lambda()>'|
类型的右值
为什么?以及如何去做
您必须指定 lambda returns 对 int 的引用 - int&
,并通过 ()
:
调用闭包
auto& getx = [&]() -> int& { // -> int& added
return x;
}(); // () added
临时值无法绑定到 lvalue 引用。如果你想让 getx
作为对 x
变量的引用,你必须从你的 lambda 中 return 引用。
lambda 表达式创建一个未知 class 类型的临时对象(称为闭包)。不能将临时对象分配给非常量引用。这意味着你需要
auto&& getx = [&]() {
return x;
}
以便您获得对闭包的右值引用,或者
auto getx = [&]() {
return x;
}
这样你就得到了闭包。
这将使代码编译,但仍需要多一点才能使 getx
的 return 值成为对 x
的引用。为此,您需要添加
auto getx = [&]() -> int& {
return x;
}
// or
auto getx = [&]() -> auto& {
return x;
}
// or
auto getx = [&]() -> decltype(auto) {
return x;
};
另请注意 main
必须 始终 return 和 int
。您应该调高编译器警告级别,以便在您尝试使用 void main
.
时出错
int main() {
int x;
auto& getx = [&]() {
return x;
}
getx() = 1;
}
这似乎不可能,因为它给了我:
错误:无法将 'main()::<lambda()>&' 类型的非常量左值引用绑定到 'main()::<lambda()>'|
类型的右值为什么?以及如何去做
您必须指定 lambda returns 对 int 的引用 - int&
,并通过 ()
:
auto& getx = [&]() -> int& { // -> int& added
return x;
}(); // () added
临时值无法绑定到 lvalue 引用。如果你想让 getx
作为对 x
变量的引用,你必须从你的 lambda 中 return 引用。
lambda 表达式创建一个未知 class 类型的临时对象(称为闭包)。不能将临时对象分配给非常量引用。这意味着你需要
auto&& getx = [&]() {
return x;
}
以便您获得对闭包的右值引用,或者
auto getx = [&]() {
return x;
}
这样你就得到了闭包。
这将使代码编译,但仍需要多一点才能使 getx
的 return 值成为对 x
的引用。为此,您需要添加
auto getx = [&]() -> int& {
return x;
}
// or
auto getx = [&]() -> auto& {
return x;
}
// or
auto getx = [&]() -> decltype(auto) {
return x;
};
另请注意 main
必须 始终 return 和 int
。您应该调高编译器警告级别,以便在您尝试使用 void main
.