C++ 我可以强制使用C++;11通过引用返回lambda?

C++ 我可以强制使用C++;11通过引用返回lambda?,c++,c++11,lambda,C++,C++11,Lambda,这不会编译,因为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; // lamb

这不会编译,因为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;
}
#包括
类项目
{
公众:
int&f(){返回数据}
私人:
int数据=0;
};
int main()
{
项目;
自动lambda=[](项和项){return Item.f();};
lambda(item)=42;//lambda(item)是一个右值=>编译时错误

std::cout您应该将lambda返回类型指定为
int&
。如果您关闭返回类型[并且lambda的形式为
返回表达式;
它将自动推断返回类型

#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;
}
#包括
类项目
{
公众:
int&f(){返回数据}
私人:
int数据=0;
};
int main()
{
项目;
自动lambda=[](项和项)->int&{return Item.f();};//指定lambda返回类型
λ(项目)=42;

std::cout您从哪里了解到lambdas只教授缩短版本?完整的语法不仅包括显式声明返回类型的方法,还包括
可变
、异常规范、属性和捕获的位置。我可以看到在第一次教授lambdas时跳过了其中一些,但没有跳过返回类型。它可以我不再阅读“返回类型是隐式的”。不过,主要文章包含了完整的语法。在C++14中,还允许在后面的返回类型中写入
auto&
,如果返回值的类型是complexor
decltype(auto)