C++ 万能引用实现完美转发示例

万能引用

万能引用的一种常见使用场景是用在模板函数中:

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值