C++11--右值引用(Perfect Forwarding)
/*
* 右值引用 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)的更多相关文章
- C++11右值引用
[C++11右值引用] 1.什么是左值?什么是右值? 左值是表达式结束后依然存在的对象:右值是表达式结束时就不再存在的对象. 2.std::move的作用是什么? std::move用于把任意类型转化 ...
- 关于C++11右值引用和移动语义的探究
关于C++11右值引用和移动语义的探究
- C++11 右值引用和转移语义
新特性的目的 右值引用 (Rvalue Referene) 是 C++ 新标准 (C++11, 11 代表 2011 年 ) 中引入的新特性 , 它实现了转移语义 (Move Sementics) 和 ...
- C++11 右值引用 与 转移语义
新特性的目的 右值引用(R-value Reference)是C++新标准(C++11, 11代表2011年)中引入的新特性,它实现了转移语义(Move Semantics)和精确传递(Perfect ...
- C++ 11 右值引用
C++11中引入的一个非常重要的概念就是右值引用.理解右值引用是学习“移动语义”(move semantics)的基础.而要理解右值引用,就必须先区分左值与右值. 注意:左值右值翻译可能有些问题 *L ...
- C++ 11 右值引用以及std::move
转载请注明出处:http://blog.csdn.net/luotuo44/article/details/46779063 新类型: int和int&是什么?都是类型.int是整数类型,in ...
- 【转】C++ 11 右值引用的理解
右值引用的目的之一,是为了C++中一个比较影响性能的问题:拷贝临时对象,例如,在 int foo(){ ... } int x; x = foo(); 中,在第三句中,发生了以下的事情: 1.销毁 x ...
- C++11右值引用和std::move语句实例解析
关键字:C++11,右值引用,rvalue,std::move,VS 2015 OS:Windows 10 右值引用(及其支持的Move语意和完美转发)是C++0x将要加入的最重大语言特性之一.从实践 ...
- c++11——右值引用
1. 左值和右值 左值是表达式结束之后仍然存在的持久化对象,而右值是指表达式结束时就不再存在的临时对象. c++11中,右值分为两种类型:将亡值(xvalue, expiring value) ...
随机推荐
- 百练-16年9月推免-C题-图像旋转
C:图像旋转 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 输入一个n行m列的黑白图像,将它顺时针旋转90度后输出. 输入 第一行包含两个整数n和m,表示图 ...
- 九度OJ1049题-去特定字符(和1111题特别像)
题目1049:字符串去特定字符 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:11329 解决:5169 题目描述: 输入字符串s和字符c,要求去掉s中所有的c字符,并输出结果. 输入: ...
- Django中的应用
1.什么是应用 应用就是网站中的一个独立的程序模块,在Django中,主目录一般不处理具体的请求,主目录一般要处理的是项目的初始化操作以及请求的分发(分布式请求处理).而具体的请求是由各个应用去处理. ...
- Cocos2dx 中的点击事件
简单记录一下2dx的鼠标交互事件.以及精灵绑定盒的点击判定 Layer 子类的 init方法中: auto listener = EventListenerTouchOneByOne::cre ...
- C语言--第三周作业评分和总结(5班)
作业链接:https://edu.cnblogs.com/campus/hljkj/CS2017-5/homework/1073 一.评分要求 要求1 完成PTA第三周所有题(20分). 要求2 4道 ...
- 结对第2次作业——WordCount进阶需求
作业题目链接 队友链接 Fork的同名仓库的Github项目地址 具体分工 玮哥负责命令参数判断.单词权重统计,我只负责词组词频统计(emmmm). PSP表格 预估耗时(分钟) 实际耗时(分钟) P ...
- acm 2072
////////////////////////////////////////////////////////////////////////////////#include<iostream ...
- php基础-7
php json数据的读取和转换 将数组转化为json <?php $arr = array('h'=>"hello", "w"=>" ...
- 《DSP using MATLAB》Problem 6.3
天不亮又醒了,拍了张景象,这就是黎明前的黑暗吗
- 【转】浅谈Nginx负载均衡与F5的区别
前言 笔者最近在负责某集团网站时,同时用到了Nginx与F5,如图所示,负载均衡器F5作为处理外界请求的第一道“墙”,将请求分发到web服务器后,web服务器上的Nginx再进行处理,静态内容直接访问 ...