2011-07-07 47 views
42

我想知道是否有人能够说出或解释xvalues,glvalues和prvalues的一些真实生活的例子吗?我看过一个类似的问题:xvalues,glvalues和prvalues的真实生活的例子?

What are rvalues, lvalues, xvalues, glvalues, and prvalues?

,但我不明白是什么意思大家。任何人都可以解释在什么情况下这些值是重要的,什么时候应该使用它们?

+14

“真实生活的例子”?你的意思是喜欢在超市里找到一个xvalue,或者想知道你的车是否可以被分类为左值? – jalf

+0

呵呵,我的意思是实际例子 – 2011-07-07 15:10:50

回答

46

考虑下面的类:

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也是一个右值。 (右值是更通用的。)

表达some_foo.original_name()左值,因为original_name返回左值参考std::string&)。每一个左翼也是一个滑翔。 (Glvalues是更通用的。)

表达std::move(some_name)x值,因为std::move返回一个rvalue参考std::string&&)。每个xvalue也是一个glvalue和一个rvalue。


注意对象和引用总是左值:

std::string a; 
std::string& b; 
std::string&& c; 

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

+0

你能解释什么时候应该使用右值引用吗? – 2011-07-10 19:22:23

+0

@ M3taSpl0it:移动构造函数和移动赋值运算符具有右值引用参数。除此之外,它们几乎没有用处。大多数情况下,它们深藏在库代码中,而你自己的代码不需要考虑右值引用。 – fredoverflow

+0

你错过了一个根本重要的例子。一个返回cv-qualified引用的函数:'std :: string const&reference_of_name()const'。这将是一个价值,对吧? –

相关问题