c++ 完美转发

85 阅读1分钟
#include <iostream>
#include <functional>

void fun1(int& val) { std::cout<< "lvalue" << std::endl;}
void fun1(int&& val) { std::cout<< "rvalue" << std::endl;}

void fun2(int&& val) { fun1(val);}

template<typename T>
void fun3(T& val) { std::cout<< "lvalue" << std::endl;}

template<typename T>
void fun3(T&& val) { std::cout<< "rvalue" << std::endl;}

template<typename T>
void fun4(T&& val) {
    fun3(std::forward<T>(val)); // 只有绑定到一个右值引用时候,forward才将其转成一个右值。
}

int main() {
    int v = 10;
    fun2(std::move(v)); // fun2期望一个右值,fun2中val是右值引用,是左值,进入fun1(int&);
    fun1(std::move(v));

    int&& v1 = 10;
//    fun2(v1);  // v1是右值引用,右值引用是一个左值,所以报错,fun2期望的是一个右值。
    fun1(v1); // 左值引用绑定一个左值,是ok的,输出lvalue

    fun2(10); // 输出的是lvalue, fun2期望一个右值,在fun2中,val是右值引用,还是左值

    // 如何规避,fun2(v)走左值,fun2(10)走右值处理
    // 使用完美转发 std::forward,,这个一般和万能引用一起用

    std::cout << "------------" << std::endl;

    fun4(v);
    fun4(10);
    return 0;
}