我不明白编译器是如何选择最好的候选者的。例如,我们有以下代码:
int function(double, int, int){...}
int function(int, double, double){...}
如果第二个函数需要转换两个变量,而第一个函数只能转换一个变量,那么为什么不选择第一个呢?为什么这是一个模棱两可的情况?
为什么这是一个模棱两可的情况?
根据§13.3.3/1,
给定这些定义,如果对于所有参数i,ICS i(F1)不是比ICS i(
F2)更差的转换序列,则可行函数F1被定义为比另一个可行函数更好的函数
-对于某些参数j,ICS j(
F1)是比ICS j(
F2)更好的转换序列,或者,如果不是这样,
— [...]
因此,像
函数(0., 0., 0.)
这样的调用是不明确的;两个重载都没有比另一个更好的匹配。
考虑从函数调用中扣除模板参数-如果模板参数
T
用于多个函数参数(如T a, T b, T c
)并且对于调用的两个参数,它被推断为int
,但对于第三个作为双
,这真的应该导致使用T=int
进行成功的扣除吗?
超负荷决断不包括更好的比赛,而是决定胜负——这还不够决定性。
想象一下一个拼图游戏——如果一块拼图在两端填充得更好,但在另一端填充得更差,那么它真的更适合填补空白吗?
一、隐式转换 1.1 使用隐式转换 隐式转换指的是以 implicit 关键字声明带有单个参数的转换函数,它将值从一种类型转换为另一种类型,以便使用之前类型所没有的功能。示例如下: // 普通人 class Person(val name: String) // 雷神 class Thor(val name: String) { // 正常情况下只有雷神才能举起雷神之锤 def hamm
JavaScript 是非常宽容的,「来者不拒」,不在乎什么类型。 例如,它如果想要接受数字,它并不拒绝其他类型的值,而是试图把它们转换成数字: > '5' - '2' 3 > '5' * '2' 10 自动转换为布尔值通常不会引起问题,而且往往很有用(译注:比如在C语言里,根本就没有布尔类型。 即使如此,这些隐式转换也会引起怪癖(quirks)。 但是当自动转换为字符串时,可能会引起问题。 一
考虑下面的代码 在第三个例子中,我知道模板推导不能发生,这就是为什么要显式指定模板参数。但是为什么没有从到
我试图理解以下转换的机制 根据整数常量,的类型是。这可以通过执行轻松检查; 根据内隐转换语义学: “整数提升是对秩小于或等于int[…]秩的任何整数类型的值的隐式转换设置为int或unsigned int类型的值。“ 如下文所述 msgstr"所有有符号整数类型的行列等于相应无符号整数类型的行列" 因此,升级适用,因为的秩与的秩相同。 这种晋升被定义为 如果int可以表示原始类型的整个值范围(或原
CLANG6、CLANG7和gcc 7.1、7.2和7.3都同意以下代码是有效的C++17代码,但在C++14和C++11下有歧义。MSVC2015和2017也接受它。然而,即使在C++17模式下,GCC-8.1和8.2也拒绝了它: 接受它的编译器选择模板化的显式转换函数。 拒绝它的编译器同意在以下两个方面存在歧义: null 以下是来自(接受代码)的错误:
问题内容: 我正在做s和s的乘法和除法,但我忘记了隐式转换规则(问题中的单词似乎太含糊,以至于Google不能比在这里问得更快)。 如果我有两个s,但我想进行浮点除法,是否只需要强制转换一个或两个操作数?如何相乘-如果我将a 和an 相乘,答案是a 吗? 问题答案: 您不能将结果除以a ,反之亦然。 因此答案是: 如果我有两个s,但是我想做浮点除法…? 一个演员就足够了。 如果我将a 和an 相乘