【发布时间】:2023-03-20 09:31:01
【问题描述】:
int main() {
int x;
auto& getx = [&]() {
return x;
}
getx() = 1;
}
这似乎不可能,因为它给了我:
错误:无法将 'main()::
为什么?以及如何做到这一点
【问题讨论】:
标签: c++ lambda reference lvalue
int main() {
int x;
auto& getx = [&]() {
return x;
}
getx() = 1;
}
这似乎不可能,因为它给了我:
错误:无法将 'main()::
为什么?以及如何做到这一点
【问题讨论】:
标签: c++ lambda reference lvalue
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 时出错。
【讨论】:
getx 是什么?您希望它是对x 的引用,还是希望它返回对x 的引用,还是返回x 的值?
getx() = 1;
您必须指定 lambda 返回对 int - int& 的引用,并通过 () 调用闭包:
auto& getx = [&]() -> int& { // -> int& added
return x;
}(); // () added
临时值不能绑定到 lvalue 引用。如果您想让getx 成为对x 变量的引用,则必须从您的lambda 返回引用。
【讨论】:
-> auto&不指定类型