万能引用
万能引用的一种常见使用场景是用在模板函数中:
template<class T>
void fun(T&& t) {
//...
}
函数参数t
就是一个万能引用,万能引用在这里的作用,简单来说就是它既能够接收左值也能接受右值
验证函数
定义一个参数为万能引用的验证函数,其根据具体接受到的是左值引用还是右值引用,分别打印不同的值:
template<class T>
void f(T &&x) {if (is_lvalue_reference_v<decltype(x)>)//接受到是左值引用cout << "lv" << endl;else if (is_rvalue_reference_v<decltype(x)>)//接受到的是右值引用cout << "rv" << endl;
}
完美转发
调用std::forwrad<>
来传递引用x
的具体引用类型
template<class T>
void out1(T &&x) {f(std::forward<T>(x));
}
测试:
int main() {int x = 1;out1(x);out1(std::move(x));
}
输出:
lv
rv
需要注意的是,就函数out1
的参数 引用x
自身而言,无论其是左值引用还是右值引用,x
本身都是一个左值,所以若函数内部直接调用f(x)
,则相当于传递传递的始终是左值,例:
template<class T>
void out2(T &&x) {f(x);
}
测试:
int main() {int x = 1;out2(x);out2(std::move(x));
}
输出:
lv
lv
参考:
https://en.cppreference.com/w/cpp/types/is_lvalue_reference
https://blog.csdn.net/lichao201005/article/details/124264766