C++标准库之右值引用相关:引用折叠

引用折叠

引用折叠出现的情况在于范型编程时。

void f(T&& param);
f(10);
int x = 10;
f(x);

这两者都可运行成功。

由于存在T&&这种未定的引用类型,当它作为参数时,有可能被一个左值引用或右值引用的参数初始化,这是经过类型推导的T&&类型,相比右值引用(&&)会发生类型的变化,这种变化就称为引用折叠。(《深入应用C++11-代码优化与工程级应用》 --- 祁宇 P68 )

引用折叠的规则如下(配合@jun-jun的答案)[和上一段的出处一样]:1.所有右值引用折叠到右值引用上仍然是一个右值引用。(A&& && 变成 A&&)2.所有的其他引用类型之间的折叠都将变成左值引用。 (A& & 变成 A&; A& && 变成 A&; A&& & 变成 A&)

作者:知乎用户 链接:https://www.zhihu.com/question/40346748/answer/88672920 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

右右得右,右左得左

原文地址:https://www.cnblogs.com/PROJECT-IDOLPROGRAM/p/9260947.html

时间: 2024-11-05 14:37:24

C++标准库之右值引用相关:引用折叠的相关文章

c/c++ 拷贝控制 右值与const引用

拷贝控制 右值与const引用 背景:当一个函数的返回值是自定义类型时,调用侧用什么类型接收?? 1,如果自定义类型的拷贝构造函数的参数用const修饰了:可以用下面的方式接收. Test t2 = fun(t1); 2,如果自定义类型的拷贝构造函数的参数没有用const修饰了:必须用下面的方式接收 const Test& t2 = fun(t1); Test t2 = fun(t1);//编译不通过 编译错误: cannot bind non-const lvalue reference of

C++11 标准新特性: 右值引用与转移语义

C++ 的新标准 C++11 已经发布一段时间了.本文介绍了新标准中的一个特性,右值引用和转移语义.这个特性能够使代码更加简洁高效. 查看本系列更多内容 | 3 评论: 李 胜利, 高级开发工程师, IBM 2013 年 7 月 10 日 内容 在 IBM Bluemix 云平台上开发并部署您的下一个应用. 开始您的试用 新特性的目的 右值引用 (Rvalue Referene) 是 C++ 新标准 (C++11, 11 代表 2011 年 ) 中引入的新特性 , 它实现了转移语义 (Move

C++11标准之右值引用(rvalue reference)

1.右值引用引入的背景 临时对象的产生和拷贝所带来的效率折损,一直是C++所为人诟病的问题.但是C++标准允许编译器对于临时对象的产生具有完全的自由度,从而发展出了Copy Elision.RVO(包括NRVO)等编译器优化技术,它们可以防止某些情况下临时对象产生和拷贝.下面简单地介绍一下Copy Elision.RVO,对此不感兴趣的可以直接跳过: (1) Copy Elision Copy Elision技术是为了防止某些不必要的临时对象产生和拷贝,例如: struct A { A(int)

[C++]右值引用和转移语义

右值引用和转移语义 本文尝试着解释何为右值引用和转移语义以及使用它们具有优势,并提供相关案例分析. 定义 左值和右值 首先我们先来理解一下什么是左值和右值. C/C++语言中可以放在赋值符号左边的变量,左值表示存储在计算机内存的对象,左值相当于地址值.右值:当一个符号或者常量放在操作符右边的时候,计算机就读取他们的"右值",也就是其代表的真实值,右值相当于数据值. C/C++语言中可以放在赋值符号左边的变量,即具有对应的可以由用户访问的存储单元,并且能够由用户去改变其值的量.左值表示存

C++右值引用浅析

一直想试着把自己理解和学习到的右值引用相关的技术细节整理并分享出来,希望能够对感兴趣的朋友提供帮助. 右值引用是C++11标准中新增的一个特性.右值引用允许程序员可以忽略逻辑上不需要的拷贝:而且还可以用来支持实现完美转发的函数.它们都是实现更高效.更健壮的库. move语义 先不展开具体右值引用定义.先说说move语义.右值引用是用来支持move语义的.move语义是指将一个同类型的对象A中的资源(可能是在堆上分配,也可能是一个文件句柄或者其他系统资源)搬移到另一个同类型的对象B中,解除对象A对

Item 24: 区分右值引用和universal引用

本文翻译自<effective modern C++>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 古人曾说事情的真相会让你觉得很自在,但是在适当的情况下,一个良好的谎言同样能解放你.这个Item就是这样一个谎言.但是,因为我们在和软件打交道,所以让我们避开"谎言"这个词,换句话来说:本Item是由"抽象"组成的. 为了声明一个指向T类型的右值引用,你会写T&&.因此我们可以"合理"地假设:如果你在源代

C++11:右值引用和转移赋值

1.首先认识左值和右值的定义: 左值:表达式可以引用到一个对象,并且这个对象是一块内存空间并可以检测和存储,这个表示即是左值. 右值:直接引用了一个存储在内存地址中的数据. 右值最大限度只能被一个常量引用: const int &a = 1; 规则:临时变量是右值,且可以改变: T().set().get() T为临时变量,set()设置新值,get()获取更改后的值. 2.首先写一个MyString类: #include<vector> class MyString { privat

[转载] C++11中的右值引用

C++11中的右值引用 May 18, 2015 移动构造函数 C++98中的左值和右值 C++11右值引用和移动语义 强制移动语义std::move() 右值引用和右值的关系 完美转发 引用折叠推导规则 特殊模板参数推导规则 解决完美转发问题 引用 在C++98中有左值和右值的概念,不过这两个概念对于很多程序员并不关心,因为不知道这两个概念照样可以写出好程序.在C++11中对右值的概念进行了增强,我个人理解这部分内容是C++11引入的特性中最难以理解的了.该特性的引入至少可以解决C++98中的

c++11 右值引用和移动语义

什么是左值.右值 最常见的误解: 等号左边的就是左值,等号右边的就是右值 左值和右值都是针对表达式而言的, 左值是指表达式结束后依然存在的持久对象 右值是指表达式结束时就不再存在的临时对象区分: 能对表达式进行取地址,则为左值 :否则为右值 为什么引入右值引用?std::vector<String> v;v.push_back("hello,world"); 调用 String::String(const char *); 调用 String::String(const S