2013-05-28 38 views
17

này không biên dịch kể từ khi lambda lợi nhuận biểu hiện bằng giá trị:Tôi có thể buộc một lambda C++ 11 trở lại bằng cách tham chiếu không?

#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; 
} 

Có một khoảng cách này? Tôi có thể buộc một lambda trả lại bằng cách tham chiếu?

+0

Trường hợp bạn đã tìm hiểu về lambdas chỉ dạy phiên bản rút gọn? Cú pháp đầy đủ bao gồm không chỉ một cách để khai báo rõ ràng kiểu trả về, mà là một nơi cho 'mutable', các đặc tả ngoại lệ, các thuộc tính và các capture. Tôi có thể thấy bỏ qua một số trong những lần đầu tiên dạy lambdas, nhưng không phải là kiểu trả về. – bames53

+0

Đó là trên wikipedia http://en.wikipedia.org/wiki/C%2B%2B11#Lambda_functions_and_expressions. Tôi ngừng đọc trên "Loại trả về là ngầm". Hóa ra là bài viết chính có chứa cú pháp đầy đủ. –

Trả lời

35

Bạn nên chỉ định loại trả về lambda là int&. Nếu bạn rời khỏi kiểu trả về [và lambda có dạng return expression;, nó sẽ tự động suy ra kiểu trả về.

#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; 
} 
+14

Trong C++ 14, nó cũng được phép viết 'tự động &' trong kiểu trả về theo sau sẽ đơn giản hơn trong trường hợp nếu kiểu giá trị trả về phức tạp – Predelnik

Các vấn đề liên quan