调用重载函数时将int型转换为double型

Conversion of int to double when calling an overloaded function

本文关键字:转换 double int 重载 函数 调用      更新时间:2023-10-16
void essai (int, double); // essai I
void essai (double, int); // essai II
int n, p; double z; char c;
essai(n,z); // calling essai I
essai(c,z); // calling essai I, after the conversion of c in int
essai(n,p); // compilation error

为什么essai(n,p)在这里产生编译错误?是因为不能从整型转换为双精度吗?

编译器查看essai的两个重载,并决定采用哪个重载,以及执行哪些转换来进行调用:

  1. essai(n,z)的情况下,重载#1获胜,因为它可以在没有转换的情况下调用,而重载#2的两个转换
  2. essai(c,z)的情况下,重载#1胜出,因为它可以通过一次将char转换为int来调用,而重载#2
  3. 则需要两次转换。
  4. essai(n,p)的情况下,两个重载都需要相同数量的转换(2)。由于没有明确的赢家,编译器认为调用有二义性,并发出错误。

void essai (int, double);
void essai (double, int);
当您调用essai(n,p);时,

是有效的重载,因为需要转换其中一个int,以便它可以转换其中任何一个。因为你有两个相等的重载,编译器放弃了,并且应该发出一个歧义编译错误。

编译器不知道该将int的哪些数据转换为double

您应该显式地将其转换为调用essai I:
essai(n,(double)p);

或调用essai II:
essai((double)n,p);