【发布时间】:2020-09-21 09:17:01
【问题描述】:
我写了这两个重载:
int func(int, int) {
return 1;
}
int func(double, double) {
return 2;
}
当我用明显的两个调用方案调用它们时,即func(1, 1) 和func(1.0, 1.0),分别调用了第一个和第二个重载函数,当我尝试调用func(1, 1.0) 时,它给了我一个错误,但是当我将1 转换为long 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时调用了第二个重载。
【问题讨论】:
-
基于提供的参数的最佳匹配。
-
long long 的字节大小与双倍相同或更接近,具体取决于您的操作系统。在任何情况下,第二个参数已经匹配一个双精度。
-
@stackoverblast 我不认为是这种情况,但也许我错了。正如我在上一段中所说,我尝试对浮点数做同样的事情(传递一个 int,这在我的机器上是相同的大小)但它没有工作。
-
无关:这是另一个值得关注的分辨率难题:String literal matches bool overload instead of std::string
-
@stackoverblast 字节大小等不要进入这个
标签: c++ double overloading overload-resolution