Подтвердить что ты не робот

Могу ли я заставить lambda С++ 11 вернуться по ссылке?

Это не компилируется, поскольку выражение 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;
}

Есть ли способ обойти это? Могу ли я заставить лямбда вернуть по ссылке?

4b9b3361

Ответ 1

Вы должны указать тип возврата лямбда для int&. Если вы оставите тип возврата [и лямбда имеет форму 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;
}