博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++11 标准库函数 std::move 和 完美转发 std::forward
阅读量:6180 次
发布时间:2019-06-21

本文共 1913 字,大约阅读时间需要 6 分钟。

c++11 标准库函数 std::move 和 完美转发 std::forward

 

#define _CRT_SECURE_NO_WARNINGS#include 
#include
#include
#include
// C++中还有一个被广泛认同的说法,那就是可以取地址的、有名字的就是左值,反之,不能取地址的、没有名字的就是右值。// 相对于左值,右值表示字面常量、表达式、函数的非引用返回值等。// 既然编译器只对右值引用才能调用转移构造函数和转移赋值函数,而所有命名对象都只能是左值引用,如果已知一个命名对象不再被使用而想对它调用转移构造函数和转移赋值函数,也就是把一个左值引用当做右值引用来使用,怎么做呢?// 标准库提供了函数 std::move,这个函数以非常简单的方式将左值引用转换为右值引用。int a;int &&r1 = a; // 编译失败int &&r2 = std::move(a); // 编译通过// 完美转发 std::forward// 完美转发适用于这样的场景:需要将一组参数原封不动的传递给另一个函数.// “原封不动”不仅仅是参数的值不变,在 C++ 中,除了参数值之外,还有一下两组属性:左值/右值和 const/non-const。// 完美转发就是在参数传递过程中,所有这些属性和参数值都不能改变,同时,而不产生额外的开销,就好像转发者不存在一样。在泛型函数中,这样的需求非常普遍。// C++11是如何解决完美转发的问题的呢?实际上,C++11是通过引入一条所谓“引用折叠”(reference collapsing)的新语言规则,并结合新的模板推导规则来完成完美转发。typedef const int T;typedef T & TR;TR &v = 1; //在C++11中,一旦出现了这样的表达式,就会发生引用折叠,即将复杂的未知表达式折叠为已知的简单表达式/*C++11中的引用折叠规则:TR的类型定义 声明v的类型 v的实际类型 T & TR T & T & TR & T & T & TR && T & T && TR T && T && TR & T & T && TR && T &&一旦定义中出现了左值引用,引用折叠总是优先将其折叠为左值引用*/// C++11中,std::forward可以保存参数的左值或右值特性#include
using namespace std;template
void process_value(T & val){ cout << "T &" << endl;}template
void process_value(T && val){ cout << "T &&" << endl;}template
void process_value(const T & val){ cout << "const T &" << endl;}template
void process_value(const T && val){ cout << "const T &&" << endl;}//函数 forward_value 是一个泛型函数,它将一个参数传递给另一个函数 process_valuetemplate
void forward_value(T && val) //参数为右值引用{ process_value( std::forward
(val) ); // C++11中,std::forward可以保存参数的左值或右值特性}void mytest(){ int a = 0; const int &b = 1; forward_value(a); // T & forward_value(b); // const T & forward_value(2); // T && forward_value( std::move(b) ); // const T && return;}int main(){ mytest(); system("pause"); return 0;}

 

转载地址:http://jtbda.baihongyu.com/

你可能感兴趣的文章
A.1.4,6,7-控制结构(if else),循环结构(for,while,do while),循环结构(switch)
查看>>
ECSHOP之transport.js/run() error:'process_request' 未定义
查看>>
dp学习笔记4
查看>>
SetTimer 与回调函数
查看>>
一步一步学Linq to sql(三):增删查改
查看>>
[ubuntu] ubuntu13.04切换桌面/工作区的方法
查看>>
连接各种数据库
查看>>
T-Sql(一)简单语法
查看>>
事务与并发
查看>>
类程序Log4j Android
查看>>
游戏运营杂谈<-最关心的游戏运营数据指标分析
查看>>
代码nullMerge two sorted linked lists
查看>>
异常选择struts2文件上传产生Source 'xxxx.tmp' does not exist
查看>>
Android用户界面开发(1):TextView
查看>>
vs2010 安装mvc3
查看>>
程序设置PAIP.在程序中设置壁纸墙纸
查看>>
关于TIME_WAIT可能引发的网络问题
查看>>
crontab 格式及例题详解
查看>>
SQL DELETE 语句
查看>>
windows7 安装程序无法创建新的系统分区或者无法识别
查看>>