gpt4 book ai didi

c++ - 为什么在传递 long long 时调用具有两个 double 类型参数的重载函数?

转载 作者:行者123 更新时间:2023-12-01 08:26:19 25 4
gpt4 key购买 nike

我写了这两个重载:

int func(int, int) {
return 1;
}

int func(double, double) {
return 2;
}

当我用明显的两种调用方案调用它们时,即 func(1, 1)func(1.0, 1.0) ,分别调用第一个和第二个重载函数,当我尝试调用 func(1, 1.0)它给了我一个错误,但是当我转换 1long long ,我没有收到错误,第二个重载是调用的那个。
#include <iostream>
int main()
{
std::cout << func(1, 1); // outputs 1.
std::cout << func(1.0, 1.0); // outputs 2.
// std::cout << func(1, 1.0); // erroneous.
std::cout << func((long long)1, 1.0); // outputs 2.
}

为什么会这样?起初,我以为是因为一些促销事件,但我尝试了第三次使用两个浮点数的重载,但我无法通过像 func((int)1, 1.0f) 那样调用它来调用它。 .我不知道为什么不一样,我也不知道为什么在 long long 时调用了第二个重载。通过了。

最佳答案

选择调用重载集中的哪个函数(即 overload resolution )取决于(部分)函数调用的多少参数必须通过 implicit conversion ,以及需要什么样的转换。
与您的示例相关的规则是:

For each pair of viable function F1 and F2, the implicit conversion sequences from the i-th argument to i-th parameter are ranked to determine which one is better.

F1 is determined to be a better function than F2 if implicit conversions for all arguments of F1 are not worse than the implicit conversions for all arguments of F2, and ... there is at least one argument of F1 whose implicit conversion is better than the corresponding implicit conversion for that argument of F2.


所以给定重载集:
int func(int, int);        // #1
int func(double, double); // #2
让我们考虑以下调用:
func(1, 1);    // perfect match for #1, so #1 is chosen

func(1., 1.); // perfect match for #2, so #2 is chosen

func(1., 1); // could call #1 by converting 1st argument to int
// (floating-integral conversion)

// could call #2 by converting 2nd argument to double
// (floating-integral conversion)

// error: ambiguous (equal number of conversions needed for both #1 and #2)

func(1ll, 1.); // could call #1 by converting both arguments to ints
// (integral conversion for 1st argument, floating-integral conversion for 2nd argument)

// could call #2 by converting just 1st argument to double
// (floating-integral conversion for 1st argument)

// for the 2nd parameter, #2 is ranked as a better choice,
// since it has a better implicit conversion sequence for #2
// and so #2 is chosen (even though both #1 and #2 are tied for the 1st argument)
现在让我们在混合中添加第三个重载:
int func(float, float);  // #3
现在,当您调用电话时:
func(1, 1.f);  // could call #1 by converting 2nd argument to int
// (floating-integral conversion for 2nd argument)

// could call #2 by converting 1st argument to double, and converting 2nd argument to double
// (floating-integral conversion for 1st argument, and floating-point promotion for 2nd argument)

// could call #3 by converting 1st argument to float
// (floating-integral conversion for 1st argument)

// error: ambiguous (equal number of conversions needed for #1, #2 and #3)

关于c++ - 为什么在传递 long long 时调用具有两个 double 类型参数的重载函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62159885/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com