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

你可能感兴趣的:(C++,C++,万能引用,完美转发)