Tôi đã đọc một chút về biểu thức lambda trên internet gần đây và dường như với tôi rằng biểu thức lambda của C++ 0x sẽ không có một kiểu (hoặc kiểu) nào sẽ liên kết độc quyền với các biểu thức lambda - nói cách khác , biểu thức lambda sẽ chỉ khớp với đối số mẫu hoặc auto
đối số/biến. Chuyện gì xảy ra, như mô tả here, làCó phải các biểu thức lambda của C++ 0x không có loại có tên không?
Trình biên dịch hỗ trợ lambdas sẽ tạo độc đáo ẩn danh functor loại cho mỗi biểu thức lambda
Câu hỏi của tôi là, đó là một điều xấu? Sẽ không có ý nghĩa khi có một số từ khóa chỉ phù hợp với các biểu thức lambda, ví dụ: lambda
, mà sẽ làm việc như sau
void f(std::function<int(int)> func)
{
func(2);
}
template<typename T>
void g(T func)
{
func(2);
}
void h(lambda func)
{
func(2);
}
int main()
{
int fpointer(int);
struct { int operator()(int var) { return var; } } functor;
f(fpointer); //ok (actually a linker error, but for the sake of example)
f(functor); //ok
f([](int var) { return var; }); //ok
g(fpointer); //ok
g(functor); //ok
g([](int var) { return var; }); //ok
h(fpointer); //error -- function pointer isn't a lambda expr
h(functor); //error -- functor isn't a lambda expr
h([](int var) { return var; }); //ok
return 0;
}
Thành thật mà nói, tôi thực sự không thể nhìn thấy tính hữu ích của việc này (đặc biệt là cho rằng auto
chấp nhận biểu thức lambda, vì vậy người ta sau đó có thể gán một lambda cho một biến), nhưng nó vẫn không ngồi ngay với tôi rằng các biểu thức lambda là các kiểu ẩn danh và không thể bị ràng buộc cụ thể chỉ với một loại cụ thể (để loại trừ tất cả các loại khác). Về bản chất, câu hỏi của tôi là, có ổn không khi các biểu thức lambda ẩn danh (cả về mặt tiện ích - việc thiếu một kiểu lambda
không cho chúng ta một số chức năng - và theo triết học - liệu nó có thực sự có ý nghĩa hay không rằng các biểu thức lambda luôn có 'loại' auto
)?
Có vẻ như bạn không biết rằng bạn có thể chấp nhận các biểu thức lambda bằng cách sử dụng 'std :: function' quá. –
Tôi đã, tuy nhiên kể từ khi chức năng chung phù hợp với cách 'tự động hoạt động (afaik), tôi nghĩ rằng nó không cần thiết để thêm * một bộ * chức năng ví dụ/chức năng cuộc gọi (nhưng nó vẫn còn tốt đề cập đến, vì vậy cảm ơn litb) – GRB
tôi nghĩ có một sự hiểu lầm về tự động. không thể sử dụng tự động làm kiểu tham số trong hàm. Nó không phải là một loại. tự động chỉ nói "suy ra loại từ initializer vì tôi quá lười biếng hoặc chỉ không thể đặt tên cho loại". – sellibitze