/*
* 右值引用 2: Perfect Forwarding
*/ void foo( boVector arg );
// boVector既有移动构造又有拷贝构造 template< typename T >
void relay(T arg ) {
foo(arg);
} int main() {
boVector reusable = createBoVector();
relay(reusable);
...
relay(createBoVector());
} // 什么才能叫完美传递,Perfect Forwarding
/*
* 1. 没有昂贵且不必要的拷贝构造
* 2. 右值传递为右值,左值传递为左值
*/ // 解决方法:
template< typename T >
void relay(T&& arg ) {
foo( std::forward<T>( arg ) );
} //* 注意:之所有有效是因为,类型T是模板类型 /*
* 引用折叠的规则 ( C++ 11 ):
* 1. T& & ==> T&
* 2. T& && ==> T&
* 3. T&& & ==> T&
* 4. T&& && ==> T&& //只有两个右值引用还是右值引用
*/ template< classs T >
struct remove_reference; // 移除类型T的引用 // T为int&
remove_refence<int&>::type i; // int i; // T为int
remove_refence<int>::type i; // int i; template< typename T >
void relay(T&& arg ) {
...
} /*
* 右值引用由type&&指定
*
* 那么type&&表示右值引用?
*/ // T&&变量以右值 => 右值引用
relay(9); => T = int&& => T&& = int&& && = int&& // T&&变量以左值初始化 => 左值引用
relay(x); => T = int& => T&& = int& && = int& // T&&是一个通用引用: 左值,右值,const,non-const等
// 前提条件:
// 1. T是一个模板类型
// 2. T发生了类型折叠
// - T 是函数模板类型,不是类模板了类型 template< typename T >
void relay(T&& arg ) {
foo( std::forward<T>( arg ) ); // 将arg转回T&&类型
} // std::forward()的实现
template<class T>
T&& forward(typename remove_reference<T>::type& arg) {
return static_cast<T&&>(arg);
} // std::move()和std::forward()比较
std::move<T>(arg); // 将arg变成一个右值类
std::forward<T>(arg); // 将arg变成T&&类型 /*
* 总结:
*
* 右值引用两个主要使用地方:
* 1. 移动语义
* 2. 完美传递
*/

C++11--右值引用(Perfect Forwarding)的更多相关文章

  1. C++11右值引用

    [C++11右值引用] 1.什么是左值?什么是右值? 左值是表达式结束后依然存在的对象:右值是表达式结束时就不再存在的对象. 2.std::move的作用是什么? std::move用于把任意类型转化 ...

  2. 关于C++11右值引用和移动语义的探究

    关于C++11右值引用和移动语义的探究

  3. C++11 右值引用和转移语义

    新特性的目的 右值引用 (Rvalue Referene) 是 C++ 新标准 (C++11, 11 代表 2011 年 ) 中引入的新特性 , 它实现了转移语义 (Move Sementics) 和 ...

  4. C++11 右值引用 与 转移语义

    新特性的目的 右值引用(R-value Reference)是C++新标准(C++11, 11代表2011年)中引入的新特性,它实现了转移语义(Move Semantics)和精确传递(Perfect ...

  5. C++ 11 右值引用

    C++11中引入的一个非常重要的概念就是右值引用.理解右值引用是学习“移动语义”(move semantics)的基础.而要理解右值引用,就必须先区分左值与右值. 注意:左值右值翻译可能有些问题 *L ...

  6. C++ 11 右值引用以及std::move

    转载请注明出处:http://blog.csdn.net/luotuo44/article/details/46779063 新类型: int和int&是什么?都是类型.int是整数类型,in ...

  7. 【转】C++ 11 右值引用的理解

    右值引用的目的之一,是为了C++中一个比较影响性能的问题:拷贝临时对象,例如,在 int foo(){ ... } int x; x = foo(); 中,在第三句中,发生了以下的事情: 1.销毁 x ...

  8. C++11右值引用和std::move语句实例解析

    关键字:C++11,右值引用,rvalue,std::move,VS 2015 OS:Windows 10 右值引用(及其支持的Move语意和完美转发)是C++0x将要加入的最重大语言特性之一.从实践 ...

  9. c++11——右值引用

    1. 左值和右值 左值是表达式结束之后仍然存在的持久化对象,而右值是指表达式结束时就不再存在的临时对象.     c++11中,右值分为两种类型:将亡值(xvalue, expiring value) ...

随机推荐

  1. 使用rsync, 向另外一台服务器同步目录和文件的脚本

    #!/bin/bash #亚特兰蒂斯-同步目录#定时任务ini_file="/usr/local/sunlight/conf/rsync-file.ini"target_ip=&q ...

  2. JSON JAVA 总结

    1.如下是我所用json第三方jar包的maven坐标 <!--可引用的jar--> <dependency> <groupId>net.sf.json-lib&l ...

  3. CF1120 C. Compress String(SAM+DP)

    有方程dp[i]=min(dp[i-1]+A,dp[j]+B):如果s[j+1,i]在s[i,j]中出现,所以我们就是要知道每个子串在s出现的第一个位置,这个可以hash实现或者sam,或者kmp实现 ...

  4. ISCC的 Web——WP

    比赛已经结束了,自己做出来的题也不是很多,跟大家分享一下 第一题:比较数字大小 打开连接 在里面随意输入一个值,他会提示数字太小了 那么我们输入他允许的最大值试试 他还是提示太小了 我们知道做web‘ ...

  5. 《DSP using MATLAB》Problem 6.7

    代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...

  6. 《DSP using MATLAB》Problem 5.32

    代码: function [y] = ovrlpadd_v3(x, h, N) %% Overlap-Add method of block convolution %% -------------- ...

  7. Js 分别取一个数的百位,十位,个位

    <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...

  8. Cassandra如何保证数据最终一致性

    Cassandra如何保证数据最终一致性:1.逆熵机制(Anti-Entropy)使用默克尔树(Merkle Tree)来确认多个副本数据一致,对于不一致数据,根据时间戳来获取最新数据. 2.读修复机 ...

  9. immutable-styles 基本试用

    此文档来自官方文档,从官方demo 学起比较快 安装 官方推荐的是通过webpack 的构建方式,通过babel loader clone 代码 git clone https://github.co ...

  10. sqler sql 转rest api 数据聚合操作

    sqler 2.0 提供了一个新的指令aggregate,注意这个和sql 的聚合函数不是一个概念,这个只是为了 方便api数据的拼接 参考格式   databases {    exec = &qu ...