Hãy xem xét ví dụ sauChức năng quá tải sử dụng lambda chức năng chữ ký
void foo(const std::function<int()>& f) {
std::cout << f() << std::endl;
}
void foo(const std::function<int(int x)>& f) {
std::cout << f(5) << std::endl;
}
int main() {
foo([](){return 3;});
foo([](int x){return x;});
}
này không biên dịch, vì các cuộc gọi đến foo
được cho là mơ hồ. Theo như tôi hiểu điều này là do thực tế, rằng hàm lambda không phải là một ưu tiên là std::function
nhưng phải được đúc cho nó và rằng có một hàm tạo std::function
lấy một đối số tùy ý.
Có thể ai đó có thể giải thích cho tôi lý do tại sao mọi người sẽ tạo một hàm tạo ngầm ẩn mất một đối số tùy ý. Tuy nhiên câu hỏi acutual của tôi là liệu có một workaround, cho phép sử dụng chữ ký chức năng của hàm lambda để quá tải một chức năng foo
. Tôi đã thử các con trỏ hàm, nhưng điều đó không có tác dụng vì việc capture các hàm lambda không thể được truyền tới một con trỏ hàm bình thường.
Mọi trợ giúp đều được chào đón nhiều nhất.
Đây có thể là lỗi trong MSVC. Nó hoạt động trong Clang/GCC. –
Oh Microsoft, bạn rất hài hước –
[Làm việc cho tôi] (http://ideone.com/XmAgLG). Bạn đang sử dụng trình biên dịch nào? –