我想知道是否有人能够说出或解释xvalues,glvalues和prvalues的一些真实生活的例子吗?我看过一个类似的问题:xvalues,glvalues和prvalues的真实生活的例子?
What are rvalues, lvalues, xvalues, glvalues, and prvalues?
,但我不明白是什么意思大家。任何人都可以解释在什么情况下这些值是重要的,什么时候应该使用它们?
我想知道是否有人能够说出或解释xvalues,glvalues和prvalues的一些真实生活的例子吗?我看过一个类似的问题:xvalues,glvalues和prvalues的真实生活的例子?
What are rvalues, lvalues, xvalues, glvalues, and prvalues?
,但我不明白是什么意思大家。任何人都可以解释在什么情况下这些值是重要的,什么时候应该使用它们?
考虑下面的类:
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;
鉴于上述声明,表达a
,b
和c
是左值。
你能解释什么时候应该使用右值引用吗? – 2011-07-10 19:22:23
@ M3taSpl0it:移动构造函数和移动赋值运算符具有右值引用参数。除此之外,它们几乎没有用处。大多数情况下,它们深藏在库代码中,而你自己的代码不需要考虑右值引用。 – fredoverflow
你错过了一个根本重要的例子。一个返回cv-qualified引用的函数:'std :: string const&reference_of_name()const'。这将是一个价值,对吧? –
“真实生活的例子”?你的意思是喜欢在超市里找到一个xvalue,或者想知道你的车是否可以被分类为左值? – jalf
呵呵,我的意思是实际例子 – 2011-07-07 15:10:50