c++ - 隐式转换如何在C++中工作

我试图弄清楚隐式转换是如何工作的。
我有3个功能

Foo(int, int)
Foo(short, short)
Foo(short, unsigned char)

然后我打电话
Foo(unsigned char, unsigned char)

并调用 Foo(int, int)。有人可以解释它如何工作吗?

最佳答案

TL; DR; 根据标准格式不正确,这就是为什么在使用gcc/clang进行编译时会收到警告/错误的原因。第一个和第三个调用之间存在歧义,因为从unsigned charshort的隐式转换顺序比从unsigned charint的隐式转换顺序差(第一个是转换,第二个是升级)。

在此示例中,您必须考虑3个不同的隐式转换序列,每个序列包含一个标准转换:

  • unsigned charunsigned char,这是完全匹配
  • unsigned charshort,它是转换的组成部分。
  • unsigned charint,它是促销不可或缺的一部分。

  • 转换顺序的排名如下:

    完全匹配> 积分促销> 积分转换

    为了使重载 FooA优于重载 FooB,对 FooA的所有参数的隐式转换必须不比对 FooB的参数的隐式转换差,并且 FooA的至少一个隐式转换必须比对 FooB的对应转换更好。 Foo(int, int)

    在您的情况下:
  • Foo(short, short)unsigned char的比较-第一个更好,因为intunsigned char(促销)比shortFoo(int, int)(转换)更好。
  • Foo(short, unsigned char)unsigned char —这是模棱两可的:
  • intunsigned charshortunsigned char的更好。
  • intunsigned charunsigned charFoo(short, short)的要差。
  • Foo(short, unsigned char)unsigned char的比较-第二个更好,因为unsigned charunsigned char(完全匹配)比shortFoo(int, int)(转换)更好。

  • Foo(short, unsigned char)Foo(short, short)之间存在歧义,第二个重载ojit_code不参与“歧义”。如果删除第一个或第三个过载,则歧义消失,并选择第一个或第三个过载。