Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板化右值引用与非模板化编译错误 #包括 #包括 使用名称空间std; 模板空f1(T&&a){} 空f2(int&&a){} int main() { int i=0; f1(i);//这很好 f2(i);//这会导致编译错误 }_C++_Templates_Rvalue Reference - Fatal编程技术网

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

}