为什么两个函数不含糊?

时间:2014-09-18 09:32:35

标签: c++ oop overloading ambiguity

我有遗留代码,后面有构造函数。

CAgs (int ar, bool isReady);
CAgs (int ar, const char* options[][2] = NULL); 

它正在编译,但它不会是模棱两可的电话吗?如果我调用CAgs (10, 0);,将调用哪个构造函数?

此行为编译器是否依赖?

6 个答案:

答案 0 :(得分:1)

来电CAgs (10, 0);不明确,因为int 0bool 指针的候选者。非零int会调用CAgs (int ar, bool isReady);,因为bool是非零情况下的唯一候选者。

答案 1 :(得分:1)

应该含糊不清。

gcc

clang

vc++

答案 2 :(得分:1)

intbool以及指针0都是整数转换(4.7 [conv.integral]),这样两个转换都有是什么让他们变得模棱两可。但是,这仅适用于int是所谓的空指针常量,如NULL0,否则int指针转换为否候选人和intbool之一被选中。

答案 3 :(得分:1)

这是含糊不清的。要解决,需要显式强制转换,例如:

CAgs(4, (bool)0);

CAgs(4, (char *)0);

答案 4 :(得分:1)

  

整体转化

     

整数类型或无范围枚举类型的prvalue可以是   转换为任何其他整数类型。如果转换列在下面   积分促销,这是促销,而不是转换。

     
      
  • 如果目标类型是无符号的,则结果值是最小无符号值,等于源模2n          其中n是用于表示目标类型的位数。
  •   
  • 也就是说,根据目标类型是更宽还是更窄,有符号整数是符号扩展[脚注1]或截断,无符号整数分别是零扩展或截断。
  •   
  • 如果目标类型已签名,则如果源整数可以在目标类型中表示,则值不会更改。否则结果是实现定义的。
  •   
  • 如果源类型为bool,则将值false转换为零,将值true转换为值之一   目标类型(请注意,如果目标类型为int,则为此   是整数提升,而不是整数转换)
  •   
  • 如果目标类型是bool,则这是一个布尔转换(请参阅         下文)
  •   

...

  

指针转换

     
      
  • 空指针常量(请参阅NULL)可以转换为任何指针类型,结果是该类型的空指针值。允许这种转换(称为空指针转换)转换为cv限定类型作为单个转换,也就是说,它不被视为数字转换和合格转换的组合。
  •   
  • 指向任何(可选的cv限定的)对象类型T的prvalue指针可以转换为prvalue指针(相同的cv限定)   无效。结果指针表示内存中的相同字节   原始指针值。如果原始指针为null   指针值,结果是空指针值   目的地类型。
  •   
  • 指向(可选cv限定的)派生类类型的prvalue指针可以转换为prvalue指针,指向其可访问的,明确的(相同的cv限定的)基类。转换的结果是指向指向对象内的基类子对象的指针。空指针值转换为空指针值   目的地类型。
  •   

...

  

布尔转换

     

整数,浮点,无范围枚举,指针的Prvalues,   和指向成员的类型可以转换为bool类型的prvalues。

     

零值(对于积分,浮点和未作用域)   枚举)和空指针和空指针到成员   价值变得虚假。所有其他值都成为现实。

     

std :: nullptr_t类型的Prvalue,包括nullptr,可以在直接初始化的上下文中转换为bool类型的prvalue(从C ++ 14开始)。结果值为false。

来源:cppreference的Implicit conversions

由于它们都是转换,因此它们具有相同的顺序,因此这应该是不明确的。但只有在0的情况下,因为0可以转换为NULL。

答案 5 :(得分:0)

的Nb。我将你的问题解释为“为什么会编译?如果我那么称它是不是很模糊这样称呼它?”

调用is ambiguous因为调用每个构造函数需要使用CAgs (10, 0);进行隐式转换

引用一些消息来源:

§4.10.1适用于const char* options[][2]类型

  

空指针常量是一个整数文字(2.14.2),其值为零   或者类型为std :: nullptr_t的prvalue。空指针常量可以是   转换为指针类型;结果是空指针值   该类型并且可以与对象的每个其他值区分开来   指针或函数指针类型。这种转换称为null   指针转换。

4.12.1 bool类型

  

算术,无范围枚举,指针或指针的prvalue   成员类型可以转换为bool类型的prvalue。零值,   null指针值,或null成员指针值转换为   假;任何其他值都转换为true。

代码肯定会编译,因为参数是两个不同且有效的类型,如果你传递的东西不需要模糊的隐式转换,它就能正常工作。但这并不意味着CAgs (10, 0);

并不含糊

作为一个小的不相关的旁注,指针的默认值使得以下内容正常工作:CAgs (10);。对于任何其他非零类型(选择bool构造函数)也是如此。