zoukankan      html  css  js  c++  java
  • C++中的左值和右值

    左值和右值的定义

    在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
  • 相关阅读:
    Redis来啦~~
    高性能mysql——高性能索引策略
    LeetCode 刷题笔记 (树)
    Java 多线程高并发编程 笔记(二)
    Java 多线程高并发编程 笔记(一)
    SVM支持向量机
    决策树
    梯度下降&随机梯度下降&批梯度下降
    统计学习方法读书笔记(1)
    HiBench学习笔记
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4505745.html
Copyright © 2011-2022 走看看