Учитывая следующий код, в чем причина двусмысленности? Могу ли я обойти это или мне придется держать (раздражающие) явные приведения?
#include <functional>
using namespace std;
int a(const function<int ()>& f)
{
return f();
}
int a(const function<int (int)>& f)
{
return f(0);
}
int x() { return 22; }
int y(int) { return 44; }
int main()
{
a(x); // Call is ambiguous.
a(y); // Call is ambiguous.
a((function<int ()>)x); // Works.
a((function<int (int)>)y); // Works.
return 0;
}
Интересно, что если я прокомментирую функцию a()
с параметром function<int ()>
и вызовом a(x)
в своей основной части, компиляция корректно завершится ошибкой из-за несоответствия типа x
и аргумента function<int (int)>
доступна только функция a()
. Если компилятор не работает в этом случае, почему возникает какая-либо двусмысленность, когда присутствуют две функции a()
?
Я пробовал VS2010 и g++ v. 4.5. Оба дают мне ту же самую двусмысленность.