Câu hỏi này là sự tiếp nối của một câu hỏi gần đây của tôi:
What is this compiler error when using a lambda as a template parameter?Lambda trở về lambda không chính xác infers loại trở lại?
11 Tháng 11 2014: Microsoft đã trả lời rằng việc sửa chữa cho lỗi này nên xuất hiện trong bản phát hành lớn tiếp theo của Visual C++.
Mã này thất bại trong việc biên dịch bằng cách sử dụng VS2012 (Cập nhật 2):
int main(int argc, char* argv[])
{
auto f = []()
{
int n = 0;
auto r = [=]{ return n; };
return r;
};
return 0;
}
Đây là lỗi biên dịch tôi nhận được:
1> main.cpp
1>C:\test\main.cpp(7): error C2440: 'return' : cannot convert from 'main::<lambda_c5d1d707b91a1ddedc06eb080503550c>::()::<lambda_ac357c309731f4971c3269160ed9c24b>' to 'int (__cdecl *)(void)'
1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
- Có vấn đề gì không với mã theo đặc điểm kỹ thuật C++ 11?
- Có sự cố với mã theo sự hỗ trợ một phần C++ 11 đã xác định của VS2012 không?
- Hoặc đây có phải là lỗi trình biên dịch C++ VS2012 không?
- Có thể ai đó cho tôi điểm diễn ra trong C++ 11 đặc điểm kỹ thuật mà nói về cách lambdas phải ngầm bột nhôm để con trỏ chức năng?
- tôi nhớ lại điều này chỉ là cho stateless lambdas - những người có khoản chụp rỗng - đó lambda nội
r
là không - Vì vậy, tại sao nó xuất hiện rằng kiểu trả về suy ra của lambda
f
là một chức năng con trỏ, cụ thể làint (__cdecl *)(void)
?
- tôi nhớ lại điều này chỉ là cho stateless lambdas - những người có khoản chụp rỗng - đó lambda nội
Giả sử nó là do người nghèo thực hiện :-) –
@CaptainObvlious Được rồi - nhưng việc truyền tới con trỏ hàm là rõ ràng * không được phép * đối với * stateful * lambdas, đúng không? –
[Không chắc chắn làm thế nào _ "không" _ nhận vào bình luận trước đó của tôi - xin lỗi;)] Theo 5.1.2/6 chuyển đổi _is_ yêu cầu nếu nó không có nắm bắt. Các tiêu chuẩn không _explicitly_ cấm chuyển đổi từ được bao gồm cho lambdas stateful mặc dù. Sự hiểu biết của tôi là vì nó đã được xác định_ việc triển khai thực hiện miễn phí bao gồm chuyển đổi ngay cả đối với các lambdas trạng thái. –