2011-01-31 48 views
26

Đối với đoạn mã sau:C++ 11 lambda trong decltype

auto F(int count) -> decltype([](int m) { return 0; }) 
{                
    return [](int m) { return 0; };         
} 

g ++ 4.5 cung cấp cho các lỗi:

test1.cpp:1:32: error: expected primary-expression before 'int' 
test1.cpp:1:32: error: expected ')' before 'int' 

vấn đề là gì? Cách chính xác để trả về lambda từ một hàm là gì?

Trả lời

39

Bạn không thể sử dụng biểu thức lambda ngoại trừ bằng cách thực sự tạo đối tượng đó - làm cho nó không thể chuyển sang loại khấu trừ như decltype.

Trớ trêu thay, tất nhiên, các quy tắc trả về lambda làm cho nó để bạn CÓ THỂ trả về lambdas từ lambdas, vì có một số tình huống mà kiểu trả về không được chỉ định.

Bạn chỉ có hai lựa chọn - trả lại một thùng chứa đa hình như std::function hoặc đặt F thành lambda thực.

auto F = [](int count) { return [](int m) { return 0; }; }; 
+0

+1 cho câu trả lời hoàn chỉnh –

+3

1 cho thanh toán bù trừ lên vấn đề. Tôi đã kiểm tra bản dự thảo SC22-N-4411 và tìm thấy loại cụm từ đáng sợ mà nói rằng "mỗi biểu thức lambda có một kiểu duy nhất". – 6502

+3

@ 6502: Vâng, thực tế đó khiến tôi nhận ra lý do kích thước thực thi của tôi đột nhiên tăng 10% do 'stable_sort'. – Mehrdad

9

thứ gì đó như thế này phù hợp với nhu cầu của bạn?

#include <functional> 

std::function<int(int)> F(int count) 
{                
    return [](int m) { return 0; };         
} 
3

Với C++ 14, điều này hoàn toàn có thể:

auto F(int count) 
{ 
    return [](int m) { return 0; }; 
} 
Các vấn đề liên quan