为什么函数重载比使用unsigned char更喜欢int?

lin*_*lof 5 c++ overloading

考虑这个程序:

#include <iostream>

using namespace std;

void f(unsigned char c) {
  cout << c << endl;
}

void f(int c) {
  cout << c << endl;
}

int main() {
  f('a');
}
Run Code Online (Sandbox Code Playgroud)

这打印出来97,表明f()所选择的重载是一个人int.我发现这很奇怪; 是不是直觉上unsigned char是一个更好的匹配char

Rak*_*111 8

是不是直觉上unsigned char是一个更好的匹配char

嗯,我想,但不是根据标准.根据[conv.prom]p1:

以外的整数类型的prvalue bool,char16_­t,char32_­t,或wchar_­t,其整数转换秩小于INT的秩可以被转换成类型的prvalue int如果int可以表示源类型的所有值; [...]

现在,三种字符类型具有相同的排名,而签名类型的排名始终小于int.这是组合[conv.rank]p1.6[conv.rank]p1.2:

  • 有符号整数类型的等级应大于具有较小大小的任何有符号整数类型的等级.

  • [...]

  • 军衔char应等于的秩signed charunsigned char.

基本上,每个角色的等级总是小于,int并且它们都可以用a表示int,因此重载unsigned char不是更好的匹配,因为它将涉及转换charunsigned char,而不是促销.

如果你改变你的超载来取一个char,那么就会有一个完全匹配,所以很自然地会选择"正确的"超载(在你眼中).