Các chương trình sau đây là bất hợp pháp, và tôi muốn hiểu lý do tại sao:Tại sao tôi không thể vượt qua một lambda đến chức năng này trong đó có một chức năng :: std?
#include <functional>
#include <iostream>
template<typename Result, typename Arg>
void deduce(std::function<Result(Arg)> f)
{
std::cout << "Result: " << typeid(Result).name() << std::endl;
std::cout << "Arg: " << typeid(Arg).name() << std::endl;
}
int main()
{
auto f = [](int x)
{
return x + 1;
};
deduce(f);
return 0;
}
clang
's đầu ra:
$ clang -std=c++11 test.cpp
test.cpp:48:3: error: no matching function for call to 'deduce'
deduce(f);
^~~~~~
test.cpp:26:6: note: candidate template ignored: could not match 'function<type-parameter-0-1 (type-parameter-0-0)>' against '<lambda at test.cpp:34:13>'
void deduce(std::function<T2(T1)> f)
^
1 error generated.
Nó có vẻ như tôi phải có khả năng chuyển đổi lambda của tôi vào std::function
đã nhận được deduce
. Tại sao không thể cho trình biên dịch áp dụng một chuyển đổi thích hợp trong trường hợp này?
Cảm ơn. Tôi hiểu các loại không giống nhau, nhưng tôi đang cố gắng hiểu tại sao trình biên dịch không thể áp dụng một chuyển đổi thích hợp ở đây. –
Vấn đề không phải là việc chuyển đổi giá trị đối số mà là việc khấu trừ các tham số mẫu. Một khi chúng được biết (như trong đoạn đầu tiên tôi đưa ra), việc chuyển đổi là tốt. Tôi sẽ thử xem tôi có thể tra cứu các quy tắc chính xác có hiệu lực ở đây hay không. – 5gon12eder
Vâng, khấu trừ là vấn đề. Nó là một khoản khấu trừ chính xác, bởi vì nếu không, mọi thứ diễn ra: Bất kỳ chuyên môn nào có thể, hoặc có thể không, có sự chuyển đổi cần thiết. – Deduplicator