深入学习c++--左值引用和右值引用

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main()
{
    int t = 10;                         //t: 左值
    int t2 = t + 1;                     //t: 右值 

    int a = 1;
    const int &b = a + 1;               // 左值引用
//    int &b = a + 1;                     // 错误
    cout << b  << " " << a << endl;

    int c = 1;
    int &&c2 = c + 1;                   // 右值引用
    cout << c2 << " " << c << endl;

    int d = 1;
    int &&dd = std::move(d);            // 直接把 左值或者右值 转换成 右值引用
    cout << dd << " " << endl;          // 注意,在调用完std::move之后,不能再使用d, 只能用dd

    string s = "hello";
    vector<string> v ;
    v.push_back(std::move(s));          // 调用移动构造函数,掏空 s, 掏空后,最好不要使用s了 !!
    cout << v.front() << endl;
    cout << "s: " << s << endl; 

    return 0;
}

参考:https://www.cnblogs.com/cly-blog/p/5980546.html

原文地址:https://www.cnblogs.com/douzujun/p/10793538.html

时间: 2024-11-05 23:28:08

深入学习c++--左值引用和右值引用的相关文章

左值引用,右值引用以及移动语义

1.左值引用 左值引用的基本语法 Type &引用名 = 左值表达式; #include <iostream> using namespace std; int main() { int a = 10; //ra是a的引用(别名),相当于把ra与a绑定. int &ra(a); cout << ra << " " << (void*)&ra << " " << (void

C++ 11中的左值引用和右值引用

1.首先区分左值和右值    左值是表达式结束后依然存在的持久对象    右值是表达式结束时就不再存在的临时对象    便捷方法:对表达式取地址,如果能,则为左值,否则为右值举例:    int a = 10    int b = 20    int *pFlag = &a    vector<int> vctTemp    vctTemp.push_back(1)    string str1 = "hello"    string str2 = "wo

左值引用和右值引用

1.左值和右值的概念 左值是可以放在赋值号左边可以被赋值的值:左值必须要在内存中有实体:         右值当在赋值号右边取出值赋给其他变量的值:右值可以在内存也可以在CPU寄存器.         一个对象被用作右值时,使用的是它的内容(值),被当作左值时,使用的是它的地址. 2.引用 引用是C++语法做的优化,引用的本质还是靠指针来实现的.引用相当于变量的别名. 引用可以改变指针的指向,还可以改变指针所指向的值. 引用的基本规则: 声明引用的时候必须初始化,且一旦绑定,不可把引用绑定到其他

左值、左值引用、右值、右值引用

1.左值和右值的概念 左值是可以放在赋值号左边可以被赋值的值:左值必须要在内存中有实体:         右值当在赋值号右边取出值赋给其他变量的值:右值可以在内存也可以在CPU寄存器.         一个对象被用作右值时,使用的是它的内容(值),被当作左值时,使用的是它的地址. 2.引用 引用是C++语法做的优化,引用的本质还是靠指针来实现的.引用相当于变量的别名. 引用可以改变指针的指向,还可以改变指针所指向的值. 引用的基本规则: 声明引用的时候必须初始化,且一旦绑定,不可把引用绑定到其他

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

这篇文章要介绍的内容和标题一致,关于C++ 11中的这几个特性网上介绍的文章很多,看了一些之后想把几个比较关键的点总结记录一下,文章比较长.给出了很多代码示例,都是编译运行测试过的,希望能用这些帮助理解C++ 11中这些比较重要的特性. 关于左值和右值的定义 左值和右值在C中就存在,不过存在感不高,在C++尤其是C++11中这两个概念比较重要,左值就是有名字的变量(对象),可以被赋值,可以在多条语句中使用,而右值呢,就是临时变量(对象),没有名字,只能在一条语句中出现,不能被赋值. 在 C++1

翻译「C++ Rvalue References Explained」C++右值引用详解 Part5:右值引用就是右值吗?

本文为第五部分,目录请参阅概述部分:http://www.cnblogs.com/harrywong/p/cpp-rvalue-references-explained-introduction.html. 右值引用就是右值吗? 同之前一样,给出一个X类,让我们可以重载它的拷贝构造函数和拷贝赋值操作符来实现move语义.现在做如下考虑: void foo(X&& x) { X anotherX = x; // ... } 一个有趣的问题就是,在foo函数内,哪一个x的拷贝构造函数重载将会被

C++左值引用和右值引用

1. 左值:一般指的是可以取地址.有名字的.反之就是右值. 2. 标准上来说,赋值运算符返回的是lvalue refering to left operand,即左值引用. 3. cosnt int & i = 1;合法,但是int& i = 1;不合法,因为右值不可以绑定到一个引用上,但是可以绑定到const 引用上. 事实上也很好理解,我们肯定不能修改字面值1,因为它就是固定的值1,因而也必须绑定到const 引用上.

error C2662 无法将左值绑定到右值 —— 变量永远是左值,即使它的类型为右值引用

1 #include <utility> 2 3 struct A 4 { 5 void f() && { } 6 }; 7 8 void g(A &&a) 9 { 10 a.f(); //error, a是左值 11 std::move(a).f(); //fine 12 } 13 14 int main() { return 0; } 其实有了右值表示临时对象这一观察结果,变量是左值这一特性并不令人惊讶.毕竟,变量是持久的,直到离开作用域时才被销毁.(<

对左值(lvalue)和右值(rvalue)的两种理解方式

在<C++ Primer 中文版(第五版)>(电子工业出版社)中的说法有: 当一个对象被用作右值的时候,用的是对象的值(内容):当对对象被用作左值的时候,用的是对象的身份(在内存中的位置). 而我在再次学习计算机原理中的"代码区.常量区.全局(静态)区.堆区.栈区"后想到的一个新理解是: 右值是不可控的,左值是可控的. 右值,要么在程序一开始运行以后就已经确定了,要么是程序运行到一定程度,系统就会确定的值,在值生成以后无法再次改变这个内容(当然也包括临时值):而左值可以随意