我正在阅读标准,并试图找出为什么这个代码不会被解决没有演员。为什么这个函数调用不明确?
void foo(char c) { }
// Way bigger than char
void foo(unsigned long int) { }
int main()
{
foo(123456789); // ambiguous
foo((unsigned long int) 123456789); // works
}
这里是这样说的:[conv.rank]
每个整数类型都有一个整数转换等级定义 如下
4.13整数转换排名:
- 的任何无符号整数类型的等级应等于对应的有符号整数类型的等级。
- 字符的排名应等于有符号字符和无符号字符的排名。
特别是,我的吉姆斯沙沙什么是它没有说任何无符号整型,只是无符号字符。我的猜测是,通过转换将char提升为无符号类型。这是真的?
也许123456789U会为你做。 – WhozCraig 2014-09-24 07:30:45
“特别是,我的吉姆斯的沙沙声是它没有说任何无符号的整数类型,只是无符号的char。我的猜测是char通过转换被提升为无符号类型,这是真的吗?” - 我认为你误解了标准中4.13的意义......'char'没有被提升为'unsigned' ......问题在于AndreyT说 - 123456789是一个int类型,它是不是明显更好地将其截断为'char'或将其作为'unsigned long'传递('long'将会同样糟糕 - 'unsigned'在这里并不重要)。 – 2014-09-24 07:37:02
尽管名称存在,但在重载解析期间,“整数转换排名”实际上并未用于对整数转换进行排名。 – 2014-09-24 09:08:59