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

时间:2017-12-25 11:46:57

标签: c++

我试图找出隐式转换的工作原理 我有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) 被调用。有人可以解释它是如何工作的吗?

1 个答案:

答案 0 :(得分:10)

TL; DR; 根据标准,这是格式错误的,这就是使用gcc / clang编译时出现警告/错误的原因。第一次和第三次调用之间存在歧义,因为从unsigned charshort的隐式转换序列比从unsigned charint的隐式转换序列更差(第一个是转换,而第二个是促销)。

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

  • unsigned charunsigned char完全匹配
  • unsigned charshort这是一个完整的转换
  • unsigned charint这是一个不可或缺的促销

转换序列的排名如下:

完全匹配&gt; 整体促销&gt; 积分转换

如果重载FooA优于重载FooB,则FooA的所有参数的隐式转换必须不比更隐蔽转换 FooB的参数,FooA的隐式转化中的至少一个必须更好,而不是FooB的相应转化。

在你的情况下:

  • Foo(int, int)Foo(short, short) - 第一个更好,因为unsigned charint(促销)优于unsigned charshort(转化率)。
  • Foo(int, int)Foo(short, unsigned char) - 这是不明确的:
    • unsigned charint优于unsigned charshort
    • unsigned charint的情况低于unsigned charunsigned char
  • Foo(short, short)Foo(short, unsigned char) - 第二个更好,因为unsigned charunsigned char(完全匹配)优于unsigned charshort (转化率)。

仅在Foo(int, int)Foo(short, unsigned char)之间存在歧义,第二次重载Foo(short, short)不参与&#34;歧义&#34;。如果删除第一个或第三个重载,则模糊性消失,并选择第一个或第三个重载。