gpt4 book ai didi

c++ - 可变参数函数和可变参数模板重载查找

转载 作者:行者123 更新时间:2023-12-03 07:00:41 27 4
gpt4 key购买 nike

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

template<typename... Args>
void f(Args&&...) {
cout << "Args..." << endl;
}

void f(...) {
cout << "..." << endl;
}
有人可以解释一下查找是如何工作的吗?在我看来,每个函数的目的都是一样的(除了第一个是 c++ 风格,第二个是 c 风格)。当我调用带有参数的函数时,尽管它们的类型 f(5, "hello")f(5, 10)它始终是可变参数模板(第一次重载),但是当我调用不带参数的函数时 f()它始终是可变参数函数(第二次重载)。编译器是否遵循一个强有力的规则来选择正确的函数,它背后的逻辑是什么?

最佳答案

是的,在 C++ 中有很多关于这个的规则。
当编译器遇到类似 f(5, 10) 的调用时,首先合成一个可行的候选列表,这涉及函数模板的实例化(涉及模板参数的 deduction)。
然后,如果列表有多个候选,overload resolution被执行。
一些关键的过载排名规则是:

  • 更好的匹配(隐式转换最少的匹配)总是首选。
  • 标准转换优于用户定义的转换,后者优于省略号。

  • 如果没有更好的匹配,则首选非模板版本。

  • 所以在 f(5, 10) 的情况下我们得到
  • f<int,int>(int,int) - 需要 0 次转换,
  • f(...) - 需要 2 个省略号“转换”。

  • 第一个需要较少的转换,所以它赢了。
    如果是 f()我们得到
  • f<>() - 需要 0 次转换,
  • f(...) - 需要 0 次转换。

  • 一个歧义,但第一个是模板,所以非模板 f(...)被选中。

    关于c++ - 可变参数函数和可变参数模板重载查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63952759/

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