我可以强制c++ 11的lambda通过引用返回吗?

Can I force a C++11 lambda to return by reference?

本文关键字:引用 返回 lambda c++ 我可以      更新时间:2023-10-16

这不能编译,因为lambda表达式按值返回:

#include <iostream>
class Item
{
public:
    int& f(){return data_;}
private:
    int data_ = 0;
};
int main()
{
    Item item;
    auto lambda = [](Item& item){return item.f();};
    lambda(item) = 42;  // lambda(item) is a rvalue => compile time error 
    std::cout << item.f() << std::endl;
    return 0;
}

有办法解决这个问题吗?我可以强制lambda通过引用返回吗?

您应该指定lambda返回类型为int&。如果您将返回类型关闭[,并且lambda的形式为return expression;,则它将自动推断返回类型。

#include <iostream>
class Item
{
public:
    int& f(){return data_;}
private:
    int data_ = 0;
};
int main()
{
    Item item;
    auto lambda = [](Item& item) ->int& {return item.f();}; // Specify lambda return type
    lambda(item) = 42;
    std::cout << item.f() << std::endl;
    return 0;
}