Skip to content

值类别

  • 泛左值:是 C++11 引入的一个概念,它主要用于描述左值和右值的统一概念。在 C++11 之前,通常将表达式分为左值(Lvalue)和右值(Rvalue)。左值是可以出现在赋值运算符左侧的表达式,而右值是不能出现在赋值运算符左侧的表达式。

    泛左值的引入主要是为了解决 C++11 中新增的右值引用(Rvalue Reference)和移动语义(Move Semantics)相关的问题。泛左值包括了传统的左值和新引入的 xvalue(eXpiring Value)。

    xvalue 是一种特殊的右值,它表示一个将要过期的对象,这个对象的资源可以被移动(Move)到另一个对象中。这样可以避免不必要的拷贝操作,提高程序的性能。

    总结一下,泛左值是一个统一的概念,包括了传统的左值和新引入的 xvalue。泛左值的主要作用是为了支持 C++11 中的右值引用和移动语义 。

  • 纯右值:(Pure Rvalue)是 C++11 中引入的一个概念,用于描述那些不能作为左值的表达式。纯右值是右值(Rvalue)的一种,它与泛左值(Generalized Lvalue)相对应。在 C++11 中,右值被细分为纯右值和 xvalue(eXpiring Value)。

    纯右值主要包括以下几种情况:

    1.字面量(Literal):例如 42、3.14 等。

    2.临时对象(Temporary Object):例如函数返回值、类型转换等产生的临时对象。

    3.无名对象(Unnamed Object):例如 std::move(x) 返回的对象。

    纯右值的主要特点是它们不能出现在赋值运算符的左侧,也不能通过引用捕获。但是,C++11 引入了右值引用(Rvalue Reference),允许我们通过右值引用捕获纯右值,从而实现移动语义(Move Semantics)和完美转发(Perfect Forwarding)等功能。

    总结一下,纯右值是 C++11 中引入的一个概念,用于描述那些不能作为左值的表达式。纯右值与泛左值相对应,它们共同组成了 C++11 中的右值。纯右值的主要作用是支持右值引用和移动语义等新特性 。

  • xvalue: 是 C++11 引入的一个概念,它是右值(Rvalue)的一种,与纯右值(Pure Rvalue)一起组成了 C++11 中的右值。xvalue 表示一个将要过期的对象,这个对象的资源可以被移动(Move)到另一个对象中。这样可以避免不必要的拷贝操作,提高程序的性能。

    xvalue 的主要特点是它们可以通过右值引用(Rvalue Reference)捕获,从而实现移动语义(Move Semantics)和完美转发(Perfect Forwarding)等功能。例如,std::move(x) 返回的对象就是一个 xvalue。

    总结一下,xvalue 是 C++11 中引入的一个概念,用于描述将要过期的对象。它与纯右值一起组成了 C++11 中的右值,主要作用是支持右值引用和移动语义等新特性 。

  • 左值(Lvalue)是 C++ 中的一个概念,它表示可以出现在赋值运算符左侧的表达式。左值通常是一个对象的内存地址,可以通过引用或指针访问。左值的名称来源于它可以出现在赋值运算符(=)的“左边”。

    以下是一些左值的例子:

    cpp
    int a = 10;
    int b = 20;
    int& ref = a;

    在这个例子中,a、b 和 ref 都是左值,因为它们都可以出现在赋值运算符的左侧,例如:

    cpp
    a = b;
    ref = b;

    左值与右值(Rvalue)相对应。右值是不能出现在赋值运算符左侧的表达式,例如字面量(42、3.14 等)和临时对象(函数返回值等)。C++11 引入了泛左值(Generalized Lvalue)和 xvalue(eXpiring Value)等概念,用于支持右值引用(Rvalue Reference)和移动语义(Move Semantics)等新特性。

    总结一下,左值是 C++ 中的一个概念,表示可以出现在赋值运算符左侧的表达式。左值通常是一个对象的内存地址,可以通过引用或指针访问。

  • 右值(Rvalue)是 C++ 中的一个概念,它表示不能出现在赋值运算符左侧的表达式。右值通常是一个临时的、无名的对象,它的生命周期很短,只在表达式求值期间存在。右值的名称来源于它可以出现在赋值运算符(=)的“右边”。

    以下是一些右值的例子:

    cpp
    int a = 10;
    int b = 20;
    int c = a + b;

    在这个例子中,a + b 是一个右值,因为它是一个临时的、无名的对象,不能出现在赋值运算符的左侧。

    右值与左值(Lvalue)相对应。左值是可以出现在赋值运算符左侧的表达式,通常是一个对象的内存地址,可以通过引用或指针访问。C++11 引入了泛左值(Generalized Lvalue)、纯右值(Pure Rvalue)和 xvalue(eXpiring Value)等概念,用于支持右值引用(Rvalue Reference)和移动语义(Move Semantics)等新特性。

    总结一下,右值是 C++ 中的一个概念,表示不能出现在赋值运算符左侧的表达式。右值通常是一个临时的、无名的对象,它的生命周期很短。右值与左值相对应,它们共同组成了 C++ 中的表达式分类。