Разве аргумент шаблона (подпись) std :: function не является частью его типа?

Учитывая следующий код, в чем причина неоднозначности? Могу ли я обойти это или мне придется сохранить (раздражающие) явные приведения?

#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 и вызовите a (x) в моем основном файле, компиляция завершится ошибкой из-за несоответствия типов между x и аргументом функцией единственной доступной функции a () . Если в этом случае компилятор выйдет из строя, зачем возникать двусмысленность, когда присутствуют две функции a () ?

Я пробовал с VS2010 и g ++ v. 4.5. Оба дают мне одинаковую двусмысленность.

39
задан Xeo 5 October 2012 в 17:56
поделиться