zoukankan      html  css  js  c++  java
  • 完美转发

    完美转发(perfect forwarding)问题是指函数模板在向其他函数传递参数时该如何保留该参数的左右值属性的问题。也就是说函数模板在向其他函数传递自身形参时,如果相应实参是左值,它就应该被转发为左值;同样如果相应实参是右值,它就应该被转发为右值。
     
    这样做是为了保留在其他函数针对转发而来的参数的左右值属性进行不同处理(比如参数为左值时实施拷贝语义;参数为右值时实施移动语义)的可能性。如果将自身参数不分左右值一律转发为左值,其他函数就只能将转发而来的参数视为左值,从而失去针对该参数的左右值属性进行不同处理的可能性。
    在C++11中,通过forward函数来实现完美转发。
    转发引用是一种特别的引用,它保持函数参数的值类别,令以 std::forward 转发参数可行
     
    一个完美转发的例子:
    
    Example:
    
    #include <iostream>  
    using namespace std;
    
    void fun(int &x) { cout << "lvalue ref" << endl; }
    void fun(int &&x) { cout << "rvalue ref" << endl; }
    void fun(const int &x) { cout << "const lvalue ref" << endl; }
    void fun(const int &&x) { cout << "const rvalue ref" << endl; }
    
    template<typename T>
    void PerfectForward(T &&t)    // 函数模板
    { 
    fun(std::forward<T>(t));   //fun是其他函数
    }
    int main() { PerfectForward(10); // rvalue ref int a; PerfectForward(a); // lvalue ref PerfectForward(std::move(a)); // rvalue ref const int b = 8; PerfectForward(b); // const lvalue ref PerfectForward(std::move(b)); // const rvalue ref getchar(); return 0; }
    输出为:

    rvalue ref
    lvalue ref
    rvalue ref
    const lvalue ref
    const rvalue ref

    可以看到,左右值属性完美地保留了。其核心就在std::forward这个模板函数。如果把函数简单的写为fun(t),则结果全为左值.
     


    新战场:https://blog.csdn.net/Stephen___Qin
  • 相关阅读:
    javascript循环
    MySQL 1130错误,无法远程连接
    理解jquery的$.extend()、$.fn.extend()【jQuery插件机制】
    2019年Java Web最流行的开发框架总结
    Java Web项目启动执行顺序
    sql 为什么要用where 1=1?
    Hadoop(六)之HDFS的存储原理(运行原理)
    Hadoop(五)搭建Hadoop客户端与Java访问HDFS集群
    Hadoop(四)HDFS集群详解
    Hadoop(三)手把手教你搭建Hadoop全分布式集群
  • 原文地址:https://www.cnblogs.com/Stephen-Qin/p/9082987.html
Copyright © 2011-2022 走看看