【发布时间】:2018-03-27 19:42:45
【问题描述】:
#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 是一个rvalue reference,因此只能绑定到一个rvalue,所以我们有一个错误。
现在,我的问题是,为什么函数 f1 中看似等效的代码可以正常工作?我知道这可能与引用折叠规则有关,即当我们执行 f1(x) 时,我们试图用类型参数 T 为 int && 来实例化 f1,因此输入参数 T&& 是 int&& &&,然后减少到 int &&。换句话说,我们有:
void f1<int &&>(int &&);
这意味着这个实例化与函数 f2 中的完全相同,对吧?那么为什么 f1 有效而 f2 无效呢?
【问题讨论】:
-
T不是int &&。T是int &。折叠到int &。见this。
标签: c++11 templates parameter-passing pass-by-reference rvalue-reference