C++ 左值和右值 您所在的位置:网站首页 c++的左值和右值 C++ 左值和右值

C++ 左值和右值

2023-04-22 02:15| 来源: 网络整理| 查看: 265

左值和右值

在C++11之前,一个变量分为左值和右值:左值是可以放在=运算符左边的值,有名字,可以用&运算符取地址(如 int n = 10;n即为左值);右值则是只能放在=运算符右边,没有名字,不能用&运算符取地址的值,一般是临时变量(非引用返回的函数返回值、表达式等,例如函数int func()的返回值,表达式a+b的返回值)、lambda表达式、不跟对象关联的字面量值,例如true,100等。

C++11以后对C++98中的右值进行了扩充,在C++11中右值又分为纯右值(prvalue,Pure Rvalue)和将亡值(xvalue,eXpiring Value)。其中纯右值的概念等同于C++98标准中右值的概念;将亡值则是C++11新增的跟右值引用相关的表达式,通常是将要被移动的对象,比如返回右值引用T&&的函数返回值、std::move()的返回值,或者转换为T&&的类型转换函数的返回值(如static_cast(10))。

//左值 int a = 10; int b = a; ++a; //前置自增/自减为左值 --a; "abcdefg"; //注意常量字符串为左值,可以对其取地址 //右值 a++; //后置自增/自减为右值 a--; a + b; 100; //其他的常量类型为右值 5.0;左值引用和右值引用

右值引用是c++11中新加入的类型,主要作用是减少对象复制时不必要的内存拷贝,以实现对象之间的快速复制:对于函数按照值返回的形式,必须创建一个临时对象,临时对象在创建好之后,则进行了一次拷贝构造,再将该临时对象拷贝构造给接收的对象,则又进行了一次拷贝构造,此时临时对象被销毁。就相当于返回一个临时对象时,会调用两次拷贝构造,对空间而言是一种浪费,程序的效率也会降低,并且临时对象的作用不是很大。

左值引用和右值引用都属于引用类型,都必须在声明时进行初始化,而其原因可以理解为是引用类型本身自己并不拥有所绑定对象的内存,只是该对象的一个别名。

一般情况下,左值引用只能接受左值对其进行初始化,右值引用只能接受右值对其进行初始化;但常左值引用是个例外,它是“万能”的引用类型:它可以接受非常量左值、常量左值、右值对其进行初始化,不过只能通过引用来读取数据,无法去修改数据,因为其被const修饰。在c++11以后,右值在函数参数匹配时会优先与右值引用绑定,而不是const左值引用。

注意:

左值引用和右值引用本身都为左值,都可以取地址。只是左值引用绑定的对象一般为左值(常左值引用可以绑定到右值对象),而右值引用绑定的对象为右值。即引用类型对象本身的左右值属性与其绑定的对象的左右值属性无关。用右值引用(或const左值引用,只读)绑定到一个临时变量时,本来会被销毁的临时变量的生存期会延长至这个引用的生存期。对于自定义类型T的对象t:如果t为左值,那么t的非静态成员也为左值,如果t为右值,那么t的非静态成员也为右值。

int a = 10, b = 30; int& n = a; //左值引用 int& n = 10; //错误,编译不过 int&& m = 100; //右值引用 m = m + 50; //m = 150 const int& k = 100; //这样也行,但是k只读,不能修改 int&& m = a + b; //m为右值引用 //以下函数返回一个将亡值(右值) constexpr int&& func(int& _Arg) { return (static_cast(_Arg)); } std::string func() { return std::string("XXXX"); } //func()返回的临时变量的生命周期会延长至pStr的生命周期 std::string&& pStr = func(); std::cout


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有