【发布时间】:2022-01-11 14:57:57
【问题描述】:
在 C++98 中有 5 个不同版本的pow:
double pow (double base, double exponent);
float pow (float base, float exponent);
long double pow (long double base, long double exponent);
double pow (double base, int exponent);
long double pow (long double base, int exponent);
我的老师告诉我,在 c++11 之前(在添加 pow 的模板版本之前),可能会出现 c++ 无法推断选择哪个重载的错误。这对我来说似乎很合理。例如考虑以下代码:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
cout << pow(4, 3);
cin.get();
}
我正在使用两个整数参数调用pow() 函数。我没有pow() 这样的重载,所以也许我应该做一些隐式转换?好的,但是选择哪一个呢?我无法选择如何转换,因为我在选择重载时模棱两可。但我试图编译这段代码(在 std=c++98 模式下)和它worked。为什么?
好吧,也许是因为第二个参数是整数。因此我只能在double pow (double base, int exponent) 和long double pow (long double base, int exponent) 之间进行选择。但是仍然决定选择哪一个编译器?如果我打电话给pow(4, 3ll)怎么办?它仍然可以编译,但对我来说类型推断不太明显。
upd:也许在这里看看 deducing 是如何工作的不是一个好主意,因为我可能永远不知道 pow 是如何真正实现的。还是这样?
【问题讨论】:
-
用户定义函数的行为是一样的,你可以试试看。比如模棱两可的时候:godbolt.org/z/GKEdfbs83
-
overload_resolution 不是一个简单的主题,当我们进入细节时。
-
@mch 奥基,我明白为什么在你的例子中在这里模棱两可。所以我决定做同样的事情,但以我的例子为例。我得到了编译错误:godbolt.org/z/Tz7xhqxce