xvalues、glvalues和prvalues的实际例子是什么?

54

我想知道是否有人能够讲解一些关于xvalues、glvalues和prvalues的实际应用例子并解释它们。我已经阅读了一个类似的问题:

什么是 rvalues、lvalues、xvalues、glvalues 和 prvalues?

但我不理解每个人所说的意思。请问在什么情况下这些值很重要,以及何时应该使用它们?


呵呵,我的意思是实际的例子。 - user72424
1个回答

58
考虑以下类:

class MyClass {

  private:

    int num1, num2;

  public:

    MyClass(int n1, int n2) : num1(n1), num2(n2) {}

    int getNum1() const { return num1; }

    int getNum2() const { return num2; }

};

class Foo
{
    std::string name;

public:

    Foo(std::string some_name) : name(std::move(some_name))
    {
    }

    std::string& original_name()
    {
        return name;
    }

    std::string copy_of_name() const
    {
        return name;
    }
};
表达式some_foo.copy_of_name()是一个prvalue,因为copy_of_name返回一个对象(std::string),而不是引用。每个prvalue也是一个rvalue。(rvalue更通用)
表达式some_foo.original_name()是一个lvalue,因为original_name返回一个左值引用(std::string&)。每个lvalue也是一个glvalue。(glvalue更通用)
表达式std::move(some_name)是一个xvalue,因为std::move返回一个右值引用(std::string&&)。每个xvalue也同时是一个glvalue和rvalue。
注意,对象和引用的名称始终是lvalue:
std::string a;
std::string& b;
std::string&& c;

鉴于上述声明,表达式abc都是左值。


你能解释一下什么时候应该使用右值引用吗? - user72424
@M3taSpl0it:移动构造函数和移动赋值运算符具有右值引用参数。除此之外,它们的用途很少。大多数情况下,它们深藏在库代码中,您自己的代码不需要关注右值引用。 - fredoverflow
你错过了一个非常重要的例子。一个返回cv限定引用的函数:std::string const& reference_of_name() const。这将是一个prvalue,对吗? - void.pointer
cppreference的文章描述了lvalue是非临时对象,而prvalue是临时对象。你能强调一下这个吗? - void.pointer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接