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.

时出错