При компиляции C++ с перегруженными определениями функций почему поведение продвижения по-разному различается между целыми типами с подписью и без знака? Это ожидаемое поведение?
В приведенном ниже примере вызов "fail" в main неоднозначен, но вызов "pass" - нет.
unsigned int fail(unsigned int a) {
return a;
}
unsigned int fail(unsigned short a) {
return a;
}
int pass(int a) {
return a;
}
int pass(short a) {
return a;
}
int main(){
unsigned char a;
char b;
fail(a);
pass(b);
return 0;
}
Пример вывода (из clang, VS-компилятор дает что-то подобное):
fail.cpp:22:3: error: call to 'fail' is ambiguous
fail(a);
^~~~
fail.cpp:1:14: note: candidate function
unsigned int fail(unsigned int a) {
^
fail.cpp:5:14: note: candidate function
unsigned int fail(unsigned short a) {
^
1 error generated.