关于右值、精确传递 (Perfect Forwarding)请教

刚刚看了篇关于精确传递 (Perfect Forwarding)的文章,有点不理解的请教下大家。

文章中提到:精确传递适用于这样的场景:需要将一组参数原封不动的传递给另一个函数。

我自己写了个测试程序

 #include <iostream>
 #include <string>
 #include <type_traits>
 using namespace std;

/*
template <typename T>
int process_value(T&& val){
   cout << typeid(val).name() << endl;
   return 1;
}
*/

void process_value(int& i) {
 std::cout << "LValue processed: " << i << std::endl;
}
void process_value(const int& i) {
 std::cout << "const LValue processed: " << i << std::endl;
}
void process_value(int &&i) {
 std::cout << "RValue processed: " << i << std::endl;
}
void process_value(const int &&i) {
 std::cout << "const RValue processed: " << i << std::endl;
}

/*
template <typename T> void forward_value(const T& val) {
  cout << "const T&"<<endl;
  process_value(val);
}
*/

template <typename T> void forward_value(T&& val) { 
//      cout << "T&&" <<endl;
        process_value(val); 
}


int main(){
        int a = 0; 
        const int &b = 1; 
        forward_value(a); // int& 
        forward_value(b); // const int& 
        forward_value(2); // int&&

        return 0;
}

结果是:
image.png

请问下:
forward_value(2) 这里常量2不是应该是个右值嘛?

根据上文:精确传递将一组参数原封不动的传递给另一个函数。forward_value(T&& val) 传递给 process_value(val) 的参数不应该还是右值嘛?所以不是应该调用process_value(int &&i)函数嘛?为什么调用的是process_value(int& i)函数?

参考文章链接精确传递 (Perfect Forwarding)

阅读 761
评论
    2 个回答
    • 333

    std::forward函数通过类型推导+引用折叠等机制,最终会将你传入的T所具有的属性原封不动的传递下去,这就是精确传递(也叫做完美转发),move和它是一个层面的东西,仅是推导过程会将传入的T推导(update:推导这里用的不严谨,应该是通过类型萃取获得其原始类型的右值引用类型)为右值引用类型(type)的右值(value category)。
    要理解这个东西你要先明白value category的机制 + 模板类型推导的机制 + 引用折叠的机制 + 左值/右值引用的机制,然后你打开任何一个版本的std::move和std::forward,能用上述机制推导出这两个函数是如何达到目的的就算理解了。
    不是我刻意要回复的复杂,而是这个问题就是这么麻烦。。。推荐你一本书《effective modern c++》里面的相关章节能帮到你。

      相似问题
      推荐文章