Một biểu thức lambda xây dựng một loại vô danh, với mỗi người có một kiểu khác nhau. Chúng không phải là triển khai std::function
. Xem thêm thông tin được cung cấp ở đây: What is a lambda expression in C++11? và ở đây: How to convert a lambda to an std::function using templates
Bạn có thể tiết lộ các loại trên trình biên dịch cụ thể của bạn với một thủ thuật như thế này:
void foo(int);
int main() {
auto a = []{ return 1; };
auto b = []{ return 1; };
foo(a);
foo(b);
return 0;
}
Biên soạn với kêu vang trên mac của tôi mang lại:
/Users/jcrotinger/ClionProjects/so_lambda_type/main.cpp:11:5: error: no matching function for call to 'foo'
foo(a);
^~~
/Users/jcrotinger/ClionProjects/so_lambda_type/main.cpp:5:6: note: candidate function not viable: no known conversion from
'<lambda at /Users/jcrotinger/ClionProjects/so_lambda_type/main.cpp:8:14>' to 'int' for 1st argument
void foo(int);
^
/Users/jcrotinger/ClionProjects/so_lambda_type/main.cpp:13:5: error: no matching function for call to 'foo'
foo(b);
^~~
/Users/jcrotinger/ClionProjects/so_lambda_type/main.cpp:5:6: note: candidate function not viable: no known conversion from
'<lambda at /Users/jcrotinger/ClionProjects/so_lambda_type/main.cpp:9:14>' to 'int' for 1st argument
void foo(int);
@Barry chỉ ra rằng bạn có thể sử dụng typeid
để thay thế. Nếu tôi in ra typeid(a).name()
và typeid(b).name()
trên hệ thống của tôi, tôi nhận được:
Z4mainE3$_0
Z4mainE3$_1
mà demangle để
main::$_0
main::$_1
Chỉ muốn bao gồm này cho đầy đủ. Tôi thực sự tìm thấy phiên bản thông báo lỗi một chút thông tin hơn. :)
'std :: function' không có kết nối ngôn ngữ như' std :: initializer_list'. – chris
Nó xuất phát từ sự thiếu hiểu biết của tôi. Hoàn toàn ngẫu nhiên. – texasbruce
Loại Lambda là [không xác định] (http://stackoverflow.com/questions/7951377/what-is-the-type-of-lambda-when-deduced-with-auto-in-c11). – Marcin