C++ 模板化右值引用与非模板化编译错误 #包括 #包括 使用名称空间std; 模板空f1(T&&a){} 空f2(int&&a){} int main() { int i=0; f1(i);//这很好 f2(i);//这会导致编译错误 }
为什么同一类型的调用具有不同的编译规则 模板化的C++ 模板化右值引用与非模板化编译错误 #包括 #包括 使用名称空间std; 模板空f1(T&&a){} 空f2(int&&a){} int main() { int i=0; f1(i);//这很好 f2(i);//这会导致编译错误 },c++,templates,rvalue-reference,C++,Templates,Rvalue Reference,为什么同一类型的调用具有不同的编译规则 模板化的f1接受lvalue,但非模板化的函数不接受lvalue。为什么? int的f1的模板实例化是否类似于f2 我可以用std::move修复编译问题。但最重要的是,我不明白 test.cpp:在函数'int main()'中:test.cpp:13:7:错误:无法将'int'左值绑定到'int&'f2(i) test.cpp:7:6:注意:初始化'void f2(int&)'void f2(int&&a){}的参数1 在模板上下文中,T&不仅仅是一个
f1
接受lvalue
,但非模板化的函数不接受lvalue
。为什么?
int的f1
的模板实例化是否类似于f2
我可以用std::move
修复编译问题。但最重要的是,我不明白
test.cpp:在函数'int main()'中:test.cpp:13:7:错误:无法将'int'左值绑定到'int&'f2(i)
test.cpp:7:6:注意:初始化'void f2(int&)'void f2(int&&a){}的参数1
在模板上下文中,
T&
不仅仅是一个右值引用,它是一个
在调用f1(i)
中,T
为int&
,根据规则,int&&
成为int&
,即左值引用
这就是为什么它能够绑定到intx
在非模板上下文(如
f2
)中,int&
只是一个右值引用,没有额外的魔力。它将仅绑定到右值。对于具体类型,&&
表示右值引用。对于模板参数T
,T&
表示通用引用。虽然看起来很相似,但这是一个区别。我曾经提醒自己(以防一些疑问/困惑再次出现):这些链接很好。
#include <typeinfo>
#include <iostream>
using namespace std;
template<typename T> void f1(T&& a) {}
void f2(int&& a) {}
int main()
{
int i = 0;
f1(i);//This is fine
f2(i);//This gives compilation error
}