C 中函数参数/参数的分辨率

Resolution of function arguments/parameters in C++

本文关键字:参数 分辨率 函数      更新时间:2023-10-16

我目前正在通过'有效的现代C '来更新我对语言的知识,并且刚刚完成了项目27,该项目处理的是超载功能,这些功能(或普遍存在(这本书称它们为参考。使用以下我写的代码:

#include <iostream>
template <typename T>
void func(T&& param) {
    std::cout << "forwarding reference versionn";
}
void func(int param) {
    std::cout << "int versionn";
}
int main() {
    func(29);
}

请有人可以解释为什么要调用int版本,即使29是一个rvalue,因此模板应该实例化地使用" void func(int&amp;&amp; param(",并且呼叫应该是转发版本?显然,这是我的理解显然缺乏的,但是对这一点的澄清会有所帮助。我知道该标准在相同的功能签名的情况下说,应该首选一个非启示功能,但是(至少在我看来(这在这里不适用吗?非常感谢。

问候,菲尔

呼叫func(29)与函数void func(int)匹配,无需转换。这被称为身份转换用于超负荷分辨率,这是排名类别精确匹配

[over.match.best]在最佳可行函数的排名规则指定何时比过载分辨率期间其他功能更好的匹配。

根据[Over.ics.rank]的说法,身份转换永远不会比任何其他转换顺序更糟糕,因此在前5个规则下永远不会击败void func(int)。规则6是:

f1被定义为比另一个可行函数更好的功能 F2如果所有参数

[...]

f1不是函数模板专业化,而f2是函数模板专业化,[...]

因此,非模板身份转换总是赢得任何模板实例化。