#include <iostream>
template <typename T> void f1(T&& r1){
std::cout<<r1;
}
void f2(int&& r2){
std::cout<<r2;
}
int main() {
int&& x = 42;
f1(x); //line 1: No error here. Why?
f2(x);//line2: Error here. why?
}
我认为,我明白为什么我们在第2行有错误时,变量x是右值参考到int 42并且被认为是一种表达,x为左值。在函数f2中,输入r2是一个右值引用,因此只能绑定到一个右值,所以我们有一个错误。为什么参考折叠规则仅适用于模板?
现在,我的问题是,为什么在函数f1中看似等价的代码工作得很好?我知道这可能是与参考倒塌规则,即当我们执行F1(x)的,我们正在试图实例F1与类型参数T为INT & &,所以输入参数T & &为int & & & &,然后减小到int & &。换句话说,我们有:
void f1<int &&>(int &&);
这意味着此实例化与函数f2中的完全相同,对吗?那么为什么f1有效而f2不能呢?
'T'不是'int &&'。 'T'是'int&'。哪个崩溃到'int&'。见[this](http://coliru.stacked-crooked.com/a/76666156bcf580f4)。 – nwp