2013-05-03 39 views

Trả lời

18

C++ 11: Số Mỗi biểu thức lambda có, tôi trích dẫn (§5.1.2/3):

[...] một độc đáo, chưa đặt tên lớp phi đoàn loại [ ...]

Điều này có nghĩa là bạn không thể biết loại lambda mà không biết biểu thức tương ứng trước.

Bây giờ, nếu bạn không nắm bắt bất cứ điều gì, bạn có thể sử dụng chuyển đổi thành con trỏ hàm và trả về (kiểu con trỏ hàm), nhưng điều đó khá hạn chế.

Như @Luc lưu ý trong Lounge, nếu bạn sẵn sàng để thay thế bạn make_counter (và nếu nó không phải là một mẫu, hoặc quá tải, hoặc một cái gì đó), sau đây sẽ làm việc:

auto const make_counter = [](int i = 0) { 
    return [i]() mutable { return i++; }; 
}; 

C++ 1y: Có, thông qua khấu trừ loại trả lại cho các chức năng thông thường (N3582).

+1

Biểu thức lambda đó cũng không hợp lệ C++ 11. Việc khấu trừ kiểu trả về sẽ không hoạt động nếu cơ thể chứa nhiều hơn chỉ là 'biểu thức trả về;' (§5.1.2,4) –

+0

Về mặt kỹ thuật bạn có thể trả về 'my_not_STD_function' chỉ cần thực hiện một cái gì đó về cơ bản tương đương ... – Yakk

+1

@Arne: Đổ lỗi OP để chỉnh sửa ...: P Đã sửa. – Xeo

10

Nếu bạn ăn gian và sử dụng khấu trừ loại trả lại, yes you can (Link). Lưu ý rằng điều này chỉ có thể vượt ra ngoài C++ 11, mặc dù nó có thể được thực hiện bằng C++ 11 thông thường, không cảnh báo bằng lambdas (có nghĩa là, một lambda bên trong một lambda trả về lamba đó). .

+0

Không phải C++ 11, chưa (chưa) chuẩn. – Xeo

+0

Vâng, C++ vẫn đang chậm. = [ –

+0

@Fred xem lại liên kết và chú ý đến dòng lệnh được sử dụng để biên dịch. –