有没有大佬懂这啥啊,C++真比法语还难😰
全部评论
原理是因为int&会被隐式转换成float&&,而float&会被隐式转换成int&&。
#include <iostream>
using namespace std;
void f(int&& ) { cout << "int"; }
void f(float&&) { cout << "float"; }
void p(int &x) { f(x); }
void p(float &x) { f(x); }
int main()
{
float x=1.0;
int y=2;
p(x);
p(y);
}
至于为什么会这么转换,我个人认为可能是bug。
可变参数模板
1. typename... 可变参数模版。2.(f(),...)括号表达式的可变参数应用 3 type&& 右值引用 4. f()函数重载———总之不懂哪个知识点就去针对性看一下吧
f(x) 中的 x 是 lvalue expression,但是实施隐式类型转换会让它变为 rvalue expression【例如 (int) x,这是一个 lvalue 还是 rvalue expression 呢?】,而隐式类型转换不能发生在同类型转换上,因此出现 int 匹配 float,float 匹配 int 的错觉。事实上将 float 改为 double 等也是一样的。代码要将 double 版本注释掉,否则会导致重载歧义,如 int 能隐式转换为 float 或 double。
要不先去看本primer
你忘了用forward,完美转发he万能引用可以了解下
vs的msvc编译直接报错 devc铁锅
还行吧这个可变参,但是建议再加上完美转发
这简单啊,找规律,int变成float,float变成int
前面两个f是同名函数,但参数不同决定了它们是两个函数,然后使用template语法来构造g函数,使得调用这个函数传入的参数类型决定调用哪一个f函数,这就是一个静态多态的表现
引用折叠,可变模版参数
完美转发
可变模板参数+右值引用+:不使用的函数参数不写参数名
不是很懂,继续学习😭
相关推荐