void baz();
void baz(int);
template<typename... Args, typename R>
void bar(R (*)(Args...));
template<typename... Args>
void foo()
{
bar<Args...>(baz);
}
int main()
{
foo<>(); // Deduces baz()
bar<>(baz); // Ambiguous
foo<int>(); // Deduces baz(int)
bar<int>(baz); // Deduces baz(int)
//foo<void>(); // Ambiguous
//bar<void>(baz); // Ambiguous
}
dm9pZCBiYXooKTsKdm9pZCBiYXooaW50KTsKCnRlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3MsIHR5cGVuYW1lIFI+CnZvaWQgYmFyKFIgKCopKEFyZ3MuLi4pKTsKCnRlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3M+CnZvaWQgZm9vKCkKewoJYmFyPEFyZ3MuLi4+KGJheik7Cn0KCmludCBtYWluKCkKewoJZm9vPD4oKTsJCSAgLy8gRGVkdWNlcyBiYXooKQoJYmFyPD4oYmF6KTsJICAvLyBBbWJpZ3VvdXMKCWZvbzxpbnQ+KCk7CQkgIC8vIERlZHVjZXMgYmF6KGludCkKCWJhcjxpbnQ+KGJheik7CSAgLy8gRGVkdWNlcyBiYXooaW50KQoJLy9mb288dm9pZD4oKTsJICAvLyBBbWJpZ3VvdXMKCS8vYmFyPHZvaWQ+KGJheik7IC8vIEFtYmlndW91cwp9Cg==
prog.cpp: In function 'int main()':
prog.cpp:16:11: error: no matching function for call to 'bar(<unresolved overloaded function type>)'
bar<>(baz); // Ambiguous
^
prog.cpp:5:6: note: candidate: template<class ... Args, class R> void bar(R (*)(Args ...))
void bar(R (*)(Args...));
^
prog.cpp:5:6: note: template argument deduction/substitution failed:
prog.cpp:16:11: note: couldn't deduce template parameter 'R'
bar<>(baz); // Ambiguous
^