Что касается следующего кода
#include <iostream>
#include <tuple>
#include <string>
#include <type_traits>
using std::cout;
using std::endl;
using std::string;
template <typename... Args>
void bar(Args&&...) {}
int change(const string&) { return 1; }
double change(int) { return 1.0; }
int main() {
// bar(1, 2.0, static_cast<int(*)(const string&)>(&change));
bar(1, 2.0, &change);
return 0;
}
Я понимаю, что ошибка в приведенном выше коде заключается в том, что ссылка на функцию change
неоднозначна (поэтому работает строка с комментариями), но тогда почему компилятор сообщает об этом сообщении об ошибке?
test.cpp:17:5: error: no matching function for call to 'bar'
bar(1, 2.0, &change);
^~~
test.cpp:11:6: note: candidate function not viable: requires 2 arguments, but 3 were
provided
void bar(Args&&...) {}
^
1 error generated.
Это происходит как на gcc ( > 5), так и на clang (Apple LLVM version 8.0.0 (clang-800.0.42.1)
)
Мне просто интересно, почему оба компиляторы не просто говорят, что ссылка неоднозначна. Я чувствую, что это как-то связано с тем, как экземпляры шаблонов работают на С++, но я не уверен в конкретной причине.