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

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++中的左值与右值(二)的更多相关文章

  1. C++中的左值和右值

    左值和右值的定义 在C++中,能够放到赋值操作符=左边的是左值,能够放到赋值操作符右边的是右值.有些变量既能够当左值又能够当右值.进一步来讲,左值为Lvalue,事实上L代表Location,表示在内 ...

  2. c++中的左值与右值

    左值(lvalue)和右值(rvalue)是 c/c++ 中一个比较晦涩基础的概念,不少写了很久c/c++的人甚至没有听过这个名字,但这个概念到了 c++11 后却变得十分重要,它们是理解 move/ ...

  3. C++中 左值和右值的区别

    总结: C++11中所有的值属于左值,右值两者之一. 左值引用:指的是可以放在赋值表达式左边的事物——在堆上或者栈上分配的命名对象或者其他对象成员——有明确的内存地址. 对左值的const引用创建临时 ...

  4. C++中让人忽视的左值和右值

    前言 为了了解C++11的新特性右值引用,不得不重新认识一下左右值.学习之初,最快的理解,莫过于望文生义了,右值那就是赋值号右边的值,左值就是赋值号左边的值.在中学的数学的学习中,我们理解的是,左值等 ...

  5. c++中的左值和右值的理解

    1.左值和右值的概念 C++中左值(lvalue)和右值(rvalue)是比较基础的概念,虽然平常几乎用不到,但C++11之后变得十分重要,它是理解 move/forward 等新语义的基础. 左值与 ...

  6. c++左值和右值

    c++编程中如果出现把一个函数的返回值.强行转化后的对象 作为函数的参数传进去时,编译器会报错的情况.这时候就该注意了,你需要把该函数的参数类型前加上const修饰. 原因在于c++的左值和右值有所区 ...

  7. c++ 左值 和 右值

    什么是lvalue, 什么是rvalue? lvalue: 具有存储性质的对象,即lvalue对象,是指要实际占用内存空间.有内存地址的那些实体对象,例如:变量(variables).函数.函数指针等 ...

  8. c++ 11 移动语义、std::move 左值、右值、将亡值、纯右值、右值引用

    为什么要用移动语义 先看看下面的代码 // rvalue_reference.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #includ ...

  9. C++ 11 左值,右值,左值引用,右值引用,std::move, std::foward

    这篇文章要介绍的内容和标题一致,关于C++ 11中的这几个特性网上介绍的文章很多,看了一些之后想把几个比较关键的点总结记录一下,文章比较长.给出了很多代码示例,都是编译运行测试过的,希望能用这些帮助理 ...

随机推荐

  1. Error Handling

    Use Exceptions Rather Than Return Codes Back in the distant past there were many languages that didn ...

  2. Java 部分注意160530

    1.1 变量的名字不可以重复 1.2 标识符命名规则:必须以字母_下划线货比富豪开头,余下的字符可以是下划线,货币符号,任何字母或数字,长度不限.不能用Java中的关键字或保留字做标识符. 1.3 l ...

  3. PCL常见编程问题

    1.如何获取pcd文件点云里点的格式,比如是pcl::PointXYZ还是pcl::PointXYZRGB等类型? #include <pcl/io/pcd_io.h> #include ...

  4. 转 通过js获取cookie的实例及简单分析

    今天review新人写的javascript代码的时候发现了很多的问题.这里以function getCookie(name){}为例. 其中比较典型的一个问题就是如何通过javascript获取co ...

  5. asp.net ajax 调用一例

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx. ...

  6. 我终于搞清楚为什么谷歌地图获取到的联通3G基站与大家手头的基站表不同了

    我终于搞清楚这个问题了,大家使用谷歌地图手机版.MobileTrack以及网优用的FieldTest获取到的WCDMA基站Cellid为什么不是大家手头的CellTrack91或基站表里的数字了... ...

  7. Linux下访问网站

    1.将打包的文件解压到/usr/local/tomcat7/webapps/ROOT下 2.将8080端口开启 3.通过浏览器访问,结果返回来的状态时Aborted,出现 严重: The web ap ...

  8. [内核]Linux workqueue

    转自:http://blog.chinaunix.net/uid-24148050-id-296982.html 一.workqueue简介workqueue与tasklet类似,都是允许内核代码请求 ...

  9. 【uTenux实验】写在开始实验之前

    1.使用的uTenux内核代码:http://www.uloong.cc/cn/download/uTenux_V1.6.00r180.zip 2.uTenux的特性: 1.微内核  2.开放源码.完 ...

  10. STM32F4 SPI2初始化及收发数据【使用库函数】

    我的STM32F4 Discovery上边有一个加速度传感器LIS302DL.在演示工程中,ST的工程师使用这个传感器做了个很令人羡慕的东西:解算开发板的姿态.当开发板倾斜时候,处于最上边的LED点亮 ...