C++中的左值与右值(二)
以前以为自己把左值和右值已经弄清楚了,果然发现自己还是太年轻了,下面的这些东西是自己通过在网上拾人牙慧,加上自己的理解写的。
1.

2. 怎么区分左值和右值:知乎大神@顾露的回答。
3. 我们不能直接定义一个引用的引用。但是,通过类型别名或通过模板类型参数间接定义是可以的。
引用折叠只能应用于间接创建引用的引用,如类型别名或模板参数。(C++ Primer 第609页)。
联想:可以定义指针的指针,也可以定义指针的引用。
4. move 永远把东西变成右值,而我们可以使用forward传递那些定义为模板类型参数的右值引用的函数参数,通过其返回类型上的引用折叠,
forward可以保持给定实参的左值/右值属性。
右值引用和返回值优化经常被很多人混在一起,而且最要命的是如果开了优化的话,其实多半输出的代码是一样的。(via 知乎@vczh)
5. 具名的右值引用是左值,不具名的右值引用是右值。(将亡值的来源)
返回不具名的右值引用主要有两种情况:
static_cast<T&&> (t);
T&& fun
{
return t;
}
正是因为返回了将亡值(不具名的右值引用),所以才可以把它们的返回值绑定到一个右值引用上。
参考:话说C++的左值、右值、将亡值。
6. T&& t (T为模板参数) 在发生自动类型推断的时候,它是未定的引用类型(universal references),如果被一个左值初始化,它就是一个左值;
如果它被一个右值初始化,它就是一个右值,它是左值还是右值取决于它的初始化。(联想到为模板元编程发明的引用折叠规则)。
需要注意的是,仅仅是当发生自动类型推导(如函数模板的类型自动推导,或auto关键字)的时候,T&&才是universal references。
没有自动类型推导的过程中,类型是确定的,是右值引用类型,只能绑定到一个右值上。
一篇我认为写的非常好的文章:从4行代码看右值引用。
7. 另外,网上介绍的一个VS的 bug 是允许函数返回局部对象的左值引用,这是不符合C++标准的。
但是可以返回右值引用和const左值引用。
8. 字面值常量中仅有字符串字面值是左值,可以用&取地址,其他的都是右值。
"abc" //左值,可以取地址
char* ptr = "abc"; //正确的写法
const char* ptr = "abc"; //正确的写法
char a[] = "abc"; char* ptr = a; //正确的写法
const char* ptr = & "abc" //错误的写法
"abc"可以直接初始化指针const char*,指针的值为字符串"abc"的首字符a的地址,但不能直接初始化char* 指针。(更正,是可以初始化char*指针的)
而&("abc")被编译器编译为const的指向数组的指针const char (*) [4](之所以是4,是因为 编译器会在"abc"后自动加上一个'\0'),它不能初始化char *类型,即使是 const char *也不行。
C++中的左值与右值(二)的更多相关文章
- C++中的左值和右值
左值和右值的定义 在C++中,能够放到赋值操作符=左边的是左值,能够放到赋值操作符右边的是右值.有些变量既能够当左值又能够当右值.进一步来讲,左值为Lvalue,事实上L代表Location,表示在内 ...
- c++中的左值与右值
左值(lvalue)和右值(rvalue)是 c/c++ 中一个比较晦涩基础的概念,不少写了很久c/c++的人甚至没有听过这个名字,但这个概念到了 c++11 后却变得十分重要,它们是理解 move/ ...
- C++中 左值和右值的区别
总结: C++11中所有的值属于左值,右值两者之一. 左值引用:指的是可以放在赋值表达式左边的事物——在堆上或者栈上分配的命名对象或者其他对象成员——有明确的内存地址. 对左值的const引用创建临时 ...
- C++中让人忽视的左值和右值
前言 为了了解C++11的新特性右值引用,不得不重新认识一下左右值.学习之初,最快的理解,莫过于望文生义了,右值那就是赋值号右边的值,左值就是赋值号左边的值.在中学的数学的学习中,我们理解的是,左值等 ...
- c++中的左值和右值的理解
1.左值和右值的概念 C++中左值(lvalue)和右值(rvalue)是比较基础的概念,虽然平常几乎用不到,但C++11之后变得十分重要,它是理解 move/forward 等新语义的基础. 左值与 ...
- c++左值和右值
c++编程中如果出现把一个函数的返回值.强行转化后的对象 作为函数的参数传进去时,编译器会报错的情况.这时候就该注意了,你需要把该函数的参数类型前加上const修饰. 原因在于c++的左值和右值有所区 ...
- c++ 左值 和 右值
什么是lvalue, 什么是rvalue? lvalue: 具有存储性质的对象,即lvalue对象,是指要实际占用内存空间.有内存地址的那些实体对象,例如:变量(variables).函数.函数指针等 ...
- c++ 11 移动语义、std::move 左值、右值、将亡值、纯右值、右值引用
为什么要用移动语义 先看看下面的代码 // rvalue_reference.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #includ ...
- C++ 11 左值,右值,左值引用,右值引用,std::move, std::foward
这篇文章要介绍的内容和标题一致,关于C++ 11中的这几个特性网上介绍的文章很多,看了一些之后想把几个比较关键的点总结记录一下,文章比较长.给出了很多代码示例,都是编译运行测试过的,希望能用这些帮助理 ...
随机推荐
- USB协议-USB的描述符及其之间的关系
USB只是一个总线,只提供一个数据通路而已.USB总线驱动程序并不知道一个设备具体如何操作,有哪些行为.具体的一个设备实现什么功能,要由设备自己来决定.那么,USB主机是如何知道一个设备的功能以及行为 ...
- 【 D3.js 入门系列 --- 2.1 】 关于如何选择,插入,删除元素
在D3.js中,选择元素的函数有两个:select 和 selectAll . 先说明一下它们的区别: select 是选择所有指定元素的第一个 selectAll 是选择指定元素的全部(以用于后面同 ...
- 2016.1.4~2016.1.7真题回顾!-- HTML5学堂
2016.1.4~2016.1.7真题回顾!-- HTML5学堂 2015悄然而逝,崭新的2016随即而行!生活需要新鲜感,学习JavaScript的过程需要有成就感!成就感又是来自于每一天的不断练习 ...
- POJ 2481 Cows(树状数组)
Cows Time Limit: 3000MS Memory L ...
- UIKIT的简介
// // UIKIT各框架的简介 // IOS笔记 // // Created by 刘威成 on 13/12/14. // Copyright © 2015年 刘威成. All rights re ...
- MySQL存储过程调试工具-dbForge Studio for MySQL
工具官网地址:http://www.devart.com/dbforge/mysql/studio/ 对于某些存储过程很多且复杂的SQL的应用,在短时间内要使得所有MySQL存储过程和函数正常运行,那 ...
- ASP.NET Web API 学习【转】
转自:http://www.cnblogs.com/babycool/p/3922738.html 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用J ...
- Centos6.5下安装protobuf及简单使用
1.protobuf是google公司提出的数据存储格式,详细介绍可以参考:https://code.google.com/p/protobuf/ 2.下载最新的protobuf,下载地址:https ...
- python---pymysql
pymysql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同.2.7用MySQLdb,3.0用pymysql. #下载安装 pip3 install pymysql 使用 执 ...
- 使用C#访问SQLLite
1.SQLLite如何集成在C#中 2.相关C#与SQLLite资源,及说明 3.简单示例