C 中函数参数/参数的分辨率
Resolution of function arguments/parameters in C++
我目前正在通过'有效的现代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是函数模板专业化,[...]
因此,非模板身份转换总是赢得任何模板实例化。
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- C 中函数参数/参数的分辨率
- 当参数不同时,重载分辨率不会选择模板
- 功能超载以NULLPTR作为参数分辨率
- 两个功能的过载分辨率采用参数包
- 提高绑定可变参数过载分辨率
- 如何获得可变参数模板功能的正确分辨率而不会太冗长
- 可变参数模板类型特征分辨率
- 使用SFINAE分辨率区分普通模板参数和模板模板参数的技术