【问题标题】:Why is the function overload that takes an int preferred over the one taking an unsigned char?为什么采用 int 的函数重载优于采用 unsigned char 的函数重载?
【发布时间】:2018-01-28 06:26:44
【问题描述】:

考虑这个程序:

#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 吗?

【问题讨论】:

  • 这是因为在你的编译器上 char == signed char
  • 我找不到合适的副本,但可能有一个。您正在寻找的是如何处理转换序列。
  • 这很相似,应该有助于解释事情。 stackoverflow.com/questions/37166131/…

标签: c++ overloading


【解决方案1】:

unsigned char 会不会更适合 char

嗯,我猜,但不是按照标准。根据[conv.prom]p1

boolchar16_­tchar32_­twchar_­t 之外的整数类型的纯右值,其整数转换秩小于 int 的秩可以转换为 int 类型的纯右值,如果int 可以表示源类型的所有值; [...]

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

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

  • [...]

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

基本上,每个字符的等级总是比int 小,它们都可以用int 表示,因此unsigned char 的重载并不是更好的匹配,因为它会涉及从@ 的转换987654343@ 到 unsigned char,而不是促销。

如果您将重载更改为采用char,那么将会完全匹配,因此自然会选择“正确”的重载(在您看来)。

【讨论】:

  • 还有一个很好的参考here“隐式转换序列的排序”部分。它基本上说整数/浮点提升优于转换。
猜你喜欢
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 2011-08-20
  • 1970-01-01
相关资源
最近更新 更多