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

时间:2017-08-19 19:55:01

标签: 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');
}

打印出97,表明所选的f()重载是int的重载。我发现这很奇怪;直觉上unsigned char不能更好地匹配char吗?

1 个答案:

答案 0 :(得分:8)

  

不会直观地将unsigned char更好地匹配char吗?

嗯,我猜,但不是根据标准。根据{{​​3}}:

  

整数转换等级小于int等级的boolchar16_­tchar32_­twchar_­t以外的整数类型的prvalue可以转换为如果int可以表示源类型的所有值,则为int类型的prvalue; [...]

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

  
      
  • 有符号整数类型的等级应大于任何有符号整数类型的等级。

  •   
  • [...]

  •   
  • char的等级应等于signed charunsigned char的等级。

  •   

基本上,每个字符的排名始终小于int,并且它们都可以用int表示,因此unsigned char的重载不是更好的匹配,因为它将涉及从charunsigned char的转换,而不是促销。

如果你改变你的过载来取char,那么就会有完全匹配,所以很自然地,&#34;正确&#34;选择过载(在你眼中)。