我有遗留代码,后面有构造函数。
CAgs (int ar, bool isReady);
CAgs (int ar, const char* options[][2] = NULL);
它正在编译,但它不会是模棱两可的电话吗?如果我调用CAgs (10, 0);
,将调用哪个构造函数?
此行为编译器是否依赖?
答案 0 :(得分:1)
来电CAgs (10, 0);
不明确,因为int
0
是bool
和指针的候选者。非零int
会调用CAgs (int ar, bool isReady);
,因为bool
是非零情况下的唯一候选者。
答案 1 :(得分:1)
答案 2 :(得分:1)
int
到bool
以及指针0
都是整数转换(4.7 [conv.integral]),这样两个转换都有是什么让他们变得模棱两可。但是,这仅适用于int
是所谓的空指针常量,如NULL
或0
,否则int
指针转换为否候选人和int
到bool
之一被选中。
答案 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
构造函数)也是如此。