C++中函数参数/参数的解析

Phi*_*987 0 c++ templates rvalue perfect-forwarding

我目前正在通过"有效的现代C++"来更新我的语言知识,并刚刚完成了第27项,该项处理重载函数,这些函数采用转发(或书中称为通用的)引用.使用以下代码我写道:

#include <iostream>

template <typename T>
void func(T&& param) {
    std::cout << "forwarding reference version\n";
}

void func(int param) {
    std::cout << "int version\n";
}

int main() {
    func(29);
}
Run Code Online (Sandbox Code Playgroud)

请有人解释为什么调用int版本,即使29是rvalue,因此模板应该实例化为"void func(int && param)"并且调用应该是转发版本?显然它就是它,所以我的理解显然缺乏,但澄清这一点会有所帮助.我理解标准说在相同功能签名的情况下,应该首选非模板化函数,但(至少在我看来)这不适用于此?非常感谢.

问候,菲尔

M.M*_*M.M 5

该调用func(29)与该函数匹配 void func(int),无需转换.这称为重载解析的身份转换,位于排名类别Exact Match中.

[over.match.best]中最佳可行函数的排名规则指定函数在重载解析期间何时比其他函数更好匹配.

根据[over.ics.rank],身份转换永远不会比任何其他转换序列更糟糕的转换序列,因此void func(int)永远不会在前5条规则下被打败.规则6是:

如果对于所有参数,F1被定义为比另一个可行函数F2更好的函数

[...]

F1不是功能模板专业化,F2是功能模板专业化,[...]

因此,非模板标识转换总是胜过任何模板实例化.