【发布时间】:2021-03-08 06:07:40
【问题描述】:
看看这些行:
template <typename T>
void f(T&& param) {
if (std::is_same<T, int>::value) {
cout << "param is an int" << endl;
} else {
cout << "param is not an int" << endl;
}
if (std::is_same<T, int&>::value) {
cout << "param is an lvalue reference to int" << endl;
}
if (std::is_same<T, int&&>::value) {
cout << "param is an rvalue reference to int" << endl;
}
}
int main() {
int i = 0;
f(i);
f(std::move(i));
return 0;
}
第一个函数调用f(i) 产生:
param is not an int
param is an lvalue reference to int
这是我的预期,因为根据模板参数推导规则,T 解析为 T&,导致 T&& & 由于引用折叠而产生 T&。
第二个函数调用f(std::move(i)) 产生
param is an int
这不是我所期望的。我早就料到了
param 是对 int 的右值引用
至少
参数不是整数
谁能解释为什么我对第二个函数调用的期望没有得到满足?
【问题讨论】:
-
T&&forint&&:T->int -
你有普遍的敬意,所以
param不能是一个价值!当T是int时,param是int&&。
标签: c++ c++11 move-semantics