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

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. IOS7.0 Xcode5 AutoLayout 备忘录

    Xcode5 xib设置autolayout方式: 列表1: (选择两个view时可设置) 左边对齐, 右边对齐, 顶部对齐, 底部对齐, x轴中心对齐, y轴中心对齐, 文本底标线对齐, (单选择一 ...

  2. Android 学习第7课,java android project 项目文档结构

    src: 主要存放java源文件 gen:用于存放由开发工具自动生成的内容 R.java(很重要),用于登记各种资源的ID,编译器在你放入资源于自动生成的,程序员不需要自己去修改,是不能自己修改的 往 ...

  3. sscanf,sscanf_s及其相关用法

    #include<stdio.h> 定义函数 int sscanf (const char *str,const char * format,........); 函数说明  sscanf ...

  4. Linux命令--系统中常用的查看命令

    摘自 http://my.oschina.net/syyzhan/blog/277536 1.查看日志文件 使用命令:cat 或者 tail -f(默认查看文件尾部10行) 相关日志文件: /var/ ...

  5. UITableView 接口的调用顺序

    ios7启用estimatedHeightForRowAtIndexPath之后的api调用顺序called -[XHYTableViewController tableView:heightForR ...

  6. 跨域之-jquery操作

    在JQ进行跨域的操作,用的是jsonp的方式,创建script标签,除了跨域的行为外,本地的操作方式都是xmlHttpRequest.

  7. Git 问题

    You are not currently on a branch, so I cannot use any 症状:有一次pull的时候又出现冲突,这回用“git reset --hard FETCH ...

  8. linux库列表

    SDL库 curses openssl zlib library curl library GNU Readline library

  9. PNG格式小图标的CSS任意颜色赋色技术

    一.眼见为实 CSS可以修改图片的颜色,没错,可以,眼见为实!您可以狠狠地点击这里:png小图标CSS赋色demo 上面的不是很黑的是原始图标,是个PNG图片,下面这个是可以赋色的: 下面,我们随意选 ...

  10. python学习-day14:集合,函数,格式化

    一.集合 定义:由不同元素组成的集合.集合是一组无序排列的可hash值, 可以作为字典的key.元素必须是不可变类型:只能存放数字,字符串,字典 特性:集合的目的是将不同的值放在一起,不同的集合之间可 ...