我想知道是否有人可以讲述或解释一些xvalues,glvalues和prvalues的真实例子?我读过类似的问题:
What are rvalues, lvalues, xvalues, glvalues, and prvalues?
但我不明白每个人的意思。任何人都可以解释这些值在什么情况下很重要,何时应该使用它们?
答案 0 :(得分:50)
考虑以下课程:
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也是一个右值。 (Rvalues更一般。)
表达式some_foo.original_name()
是左值,因为original_name
返回左值引用(std::string&
)。每个左值也是一个glvalue。 (Glvalues更通用。)
表达式std::move(some_name)
是 xvalue ,因为std::move
返回右值引用(std::string&&
)。每个xvalue也都是glvalue和rvalue。
请注意,对象和引用的名称始终是左值:
std::string a;
std::string& b;
std::string&& c;
鉴于上述声明,表达式a
,b
和c
是左值。