首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >变量函数与可变模板重载查找

问变量函数与可变模板重载查找
EN

Stack Overflow用户
提问于 2020-09-18 09:09:22
回答 1查看 97关注 0票数 2

我有一个带有两个重载参数的函数

代码语言:javascript
复制
template<typename... Args>
void f(Args&&...) {
    cout << "Args..." << endl;
}
 
void f(...) {
    cout << "..." << endl;
}

有人能解释一下查找是如何工作的吗?在我看来,每个函数的目的是相同的(除了第一个是c++样式,第二个是c风格)。当我用参数调用函数时,尽管参数类型是f(5, "hello")或f(5, 10),它总是变量模板(第一个重载),但是当我调用没有参数的函数( f() )时,它总是变量函数(第二个重载)。是否有一个强大的规则,编译器遵循选择正确的函数和背后的逻辑是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-18 09:48:22

是的,在C++中有很多关于这方面的规则。

当编译器遇到像f(5, 10)这样的调用时,首先合成一个可行的候选列表,这涉及函数模板的实例化(它涉及模板参数的演绎 )。

然后,如果列表中有多个候选项,则执行过载分辨率。

一些关键的重载排序规则是:

  • 更好的匹配(隐式转换最少的匹配)总是首选的。
代码语言:javascript
复制
- 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(...) .

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63952759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档