我有一个带有两个重载参数的函数
template<typename... Args>
void f(Args&&...) {
cout << "Args..." << endl;
}
void f(...) {
cout << "..." << endl;
}有人能解释一下查找是如何工作的吗?在我看来,每个函数的目的是相同的(除了第一个是c++样式,第二个是c风格)。当我用参数调用函数时,尽管参数类型是f(5, "hello")或f(5, 10),它总是变量模板(第一个重载),但是当我调用没有参数的函数( f() )时,它总是变量函数(第二个重载)。是否有一个强大的规则,编译器遵循选择正确的函数和背后的逻辑是什么?
发布于 2020-09-18 09:48:22
是的,在C++中有很多关于这方面的规则。
当编译器遇到像f(5, 10)这样的调用时,首先合成一个可行的候选列表,这涉及函数模板的实例化(它涉及模板参数的演绎 )。
然后,如果列表中有多个候选项,则执行过载分辨率。
一些关键的重载排序规则是:
- A standard conversion is better than a user-defined conversion, which is better than the ellipsis.所以在f(5, 10)的情况下
f<int,int>(int,int) -需要0转换,f(...) -需要两个省略号“转换”。第一项要求较少的转换,因此它获胜。
在f()的情况下我们得到
f<>() -需要0转换,f(...) -需要0转换。一个歧义,但第一个是模板,所以选择非模板f(...) .
https://stackoverflow.com/questions/63952759
复制相似问题