考虑这个程序:
#include <iostream>
using namespace std;
void f(unsigned char c) {
cout << c << endl;
}
void f(int c) {
cout << c << endl;
}
int main() {
f('a');
}
打印出97
,表明所选的f()
重载是int
的重载。我发现这很奇怪;直觉上unsigned char
不能更好地匹配char
吗?
答案 0 :(得分:8)
不会直观地将
unsigned char
更好地匹配char
吗?
嗯,我猜,但不是根据标准。根据{{3}}:
整数转换等级小于int等级的
bool
,char16_t
,char32_t
或wchar_t
以外的整数类型的prvalue可以转换为如果int
可以表示源类型的所有值,则为int
类型的prvalue; [...]
现在,三种字符类型具有相同的排名,而签名类型的排名始终小于int
。这是[conv.prom]p1
和[conv.rank]p1.6
的组合:
有符号整数类型的等级应大于任何有符号整数类型的等级。
[...]
char
的等级应等于signed char
和unsigned char
的等级。
基本上,每个字符的排名始终小于int
,并且它们都可以用int
表示,因此unsigned char
的重载不是更好的匹配,因为它将涉及从char
到unsigned char
的转换,而不是促销。
如果你改变你的过载来取char
,那么就会有完全匹配,所以很自然地,&#34;正确&#34;选择过载(在你眼中)。