我试图找出隐式转换的工作原理 我有3个功能
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<table id="Table">
<tr>
<td>
<input name="Ref1_1330" type="text" id="Ref1_1330" dir="ltr"
value="2342" />
</td>
<td>
<input name="Ref2_1330" type="text" id="Ref2_1330" dir="ltr"
value="23342" />
</td>
</tr>
<tr>
<td><input name="Ref1_1474" type="text" id="Ref1_1474" dir="ltr" value='657'/>
</td>
<td><input name="Ref2_1474" type="text" id="Ref2_1474" dir="ltr" value='957' />
</td>
</tr>
</table>
然后我打电话给
Foo(int, int)
Foo(short, short)
Foo(short, unsigned char)
和Foo(unsigned char, unsigned char)
被调用。有人可以解释它是如何工作的吗?
答案 0 :(得分:10)
TL; DR; 根据标准,这是格式错误的,这就是使用gcc / clang编译时出现警告/错误的原因。第一次和第三次调用之间存在歧义,因为从unsigned char
到short
的隐式转换序列比从unsigned char
到int
的隐式转换序列更差(第一个是转换,而第二个是促销)。
在此示例中,您必须考虑3个不同的隐式转换序列,每个转换序列包含一个标准转换:
unsigned char
至unsigned char
,完全匹配。unsigned char
至short
这是一个完整的转换。unsigned char
至int
这是一个不可或缺的促销。转换序列的排名如下:
完全匹配&gt; 整体促销&gt; 积分转换
如果重载FooA
优于重载FooB
,则FooA
的所有参数的隐式转换必须不比更隐蔽转换 FooB
的参数,FooA
的隐式转化中的至少一个必须更好,而不是FooB
的相应转化。
在你的情况下:
Foo(int, int)
与Foo(short, short)
- 第一个更好,因为unsigned char
到int
(促销)优于unsigned char
到short
(转化率)。Foo(int, int)
与Foo(short, unsigned char)
- 这是不明确的:
unsigned char
至int
优于unsigned char
至short
。unsigned char
至int
的情况低于unsigned char
至unsigned char
。Foo(short, short)
与Foo(short, unsigned char)
- 第二个更好,因为unsigned char
到unsigned char
(完全匹配)优于unsigned char
到short
(转化率)。仅在Foo(int, int)
和Foo(short, unsigned char)
之间存在歧义,第二次重载Foo(short, short)
不参与&#34;歧义&#34;。如果删除第一个或第三个重载,则模糊性消失,并选择第一个或第三个重载。