Почему неоднозначно называть перегруженные ambig (long) и ambig (unsigned long) с целочисленным литералом?

При компиляции

void ambig(  signed long) { }
void ambig(unsigned long) { }

int main(void) { ambig(-1); return 0; }

я получаю

error C2668: 'ambig' : ambiguous call to overloaded function
    could be 'void ambig(unsigned long)'
    or 'void ambig(long)'
while trying to match the argument list '(int)'

Я знаю, что могу «исправить» это, сказав -1L вместо -1 , но почему / как именно это считается неоднозначным в первую очередь?

31
задан Mehrdad 19 August 2012 в 03:20
поделиться