左值和右值的定义

在C++中,能够放到赋值操作符=左边的是左值,能够放到赋值操作符右边的是右值。有些变量既能够当左值又能够当右值。进一步来讲,左值为Lvalue,事实上L代表Location,表示在内存中能够寻址,能够给它赋值(常量const类型也能够寻址,可是不能赋值),Rvalue中的R代表Read,就是能够知道它的值。比如:
int a=3;
a在内存中有地址,而3没有,可是能够read到它的值。
3=4;
这个是错误的,由于3的内存中没有地址,不能当作左值。
以下这个语句不easy出错
a++=3;
这个语句编译通只是的,原因在于a++是先使用a的值,再给a加1。实现例如以下:
{
int tmp=a;
a=a+1;
return tmp;
}

a++是右值。

++a=3;
这个是正确的,++a的实现例如以下:
{
a=a+1;
return &a;
}

显然++a的效率高。

左值符号&和右值符号&&

左值的声明符号为&,右值的声明符号为&&。在C++中,暂时对象不能作为左值,可是能够作为常量引用const &
#include<iostream>
void print_lvalue(int& i)//左值
{
std::cout << "Lvalue:" << i << std::endl;
}
void print_rvalue(int&& i)//右值
{
std::cout << "Rvalue:" << i << std::endl;
} int main()
{
int i = 0;
print_lvalue(i);
print_rvalue(1);
//print_lvalue(1)会出错
//print_lvalue(const int& i)能够使用print_lvalue(1)
return 0;
}

C++11中的move

有时候我们希望把左值当作右值来使用,比如一个变量的值,不再使用了,希望把它的值转移出去,C++11中的std::move就为我们提供了将左值引用转为右值引用的方法。
#include<iostream>
void print_value(int& i)//左值
{
std::cout << "Lvalue:" << i << std::endl;
}
void print_value(int&& i)//右值
{
std::cout << "Rvalue:" << i << std::endl;
} int main()
{
int i = 10;
print_value(i);
print_value(std::move(i));
return 0;
}

最长用的交换函数

void swap(T& a, T& b)
{
T tmp = std::move(a);
a = std::move(b);
b = std::move(tmp);
}

避免了3次拷贝。

精确值传递

std::forward主要用于模板编程中,值传递的问题。能够猜測參数是左值引用还是右值引用,精确传递值。參考这里:
http://blog.csdn.net/zwvista/article/details/6848582

C++中的左值和右值的更多相关文章

  1. C++中的左值与右值(二)

    以前以为自己把左值和右值已经弄清楚了,果然发现自己还是太年轻了,下面的这些东西是自己通过在网上拾人牙慧,加上自己的理解写的. 1. 2. 怎么区分左值和右值:知乎大神@顾露的回答. 3. 我们不能直接 ...

  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. 定制Attribute

    目录 Attribute是什么 自定义Attribute 一.Attribute是什么 将一些附加信息与制定目标相关联的方式.编译器在元数据中生成这些额外的信息.也叫做特性. 比如之前文章中提到的:枚 ...

  2. folat i = 0.1; 警告

    今天的用途  float i = 0.1;那么编译器警告实际: #include <iostream> using namespace std; int main() { float k ...

  3. .net卸载程序制作

    原文:.net卸载程序制作 方法一: 在打包项目中添加文件msiexec.exe(一般在c:\windows\system32(系统目录中)找到). 在文件系统视图中选择应用程序文件,在msiexec ...

  4. Android Studio 100 tips and tricks

    关于本文 本文是想总结一些Android Studio的使用技巧,对于大多数习惯了使用eclipse的人来说,可能会须要一段时间,可是假设看过以下的一些介绍,你就能体会到Android Studio的 ...

  5. 一个Bug的反思

    对输入数据判重,使用Map,将对象作为Key,使用map的containsKey方法来着重是否是重复记录.正常的处理流程:(1)将输入的数据封装成对象(2)判重,将没有重复的数据存储到map(3)对没 ...

  6. POJ 2762 Going from u to v or from v to u?(强连通分量+拓扑排序)

    职务地址:id=2762">POJ 2762 先缩小点.进而推断网络拓扑结构是否每个号码1(排序我是想不出来这点的. .. ).由于假如有一层为2的话,那么从此之后这两个岔路的点就不可 ...

  7. SendRedirect和forward差分

    (1)重定向JSP实现JSP/Servlet跳转到目标资源的方法中,基本的想法是:server目标资源完成URL通过HTTP 在回答本报发client浏览器.收到的浏览器URL更新到地址栏后,而目标资 ...

  8. 【DataStructure】Some useful methods for arrays

    Last night it took me about two hours to learn arrays. For the sake of less time, I did not put emph ...

  9. MySQL学习系列2--MySQL执行计划分析EXPLAIN

    原文:MySQL学习系列2--MySQL执行计划分析EXPLAIN 1.Explain语法 EXPLAIN SELECT …… 变体:   EXPLAIN EXTENDED SELECT …… 将执行 ...

  10. Bringing up interface eth0: Device eth0 does not seem to be present, delaying initialization

    跑 service network restart  NIC出现无法启动,他说,没有发现 Bringing up interface eth0: Device eth0 does not seem t ...