为什么这个函数调用不明确?

时间:2014-09-24 07:16:41

标签: c++ integer implicit-conversion unsigned-integer integer-promotion

我正在阅读标准并试图弄清楚为什么这些代码不会在没有演员表的情况下得到解决。

void foo(char c) { }

// Way bigger than char
void foo(unsigned long int) { }

int main()
{
   foo(123456789); // ambiguous
   foo((unsigned long int) 123456789); // works
}

这就是它所说的:

  

4.13整数转换排名[conv.rank]

     

每个整数类型都定义了整数转换等级   如下:

     

- 任何无符号整数类型的等级应等于   对应的有符号整数类型

     

- char的等级应等于signed char和unsigned的等级   炭。

特别是,我的摇摇晃晃的是它没有说任何无符号整数类型,只是unsigned char。我的猜测是,char通过转换被提升为无符号类型。这是真的吗?

1 个答案:

答案 0 :(得分:51)

它与4.13中定义的类型的等级几乎没有关系。 4.13定义的内部排名用于描述整体促销和通常的算术转换。它们本身并不直接影响重载决策。与超载分辨率相关的排名在" 13.3.3.1.1标准转换序列"中定义。然后用于" 13.3.3.2对隐式转换序列进行排序"。

因此,它是关于13.3中定义的转换等级。 123456789是您平台上int类型的整数文字。这意味着调用函数的charunsigned long版本需要从intchar或从intunsigned long进行隐式转换。在这两种情况下,我们都进行了"积分转换"类型。这意味着这两个功能同样是“坏”"在这种情况下。因此含糊不清。

如果其中一个功能只需要一个完整的促销(而不是整体转换),它将赢得解决方案,并且该呼叫将被视为明确无误。但是,您的两个功能都需要完整的转换