en cuenta la clase siguiente:
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;
}
};
La expresión some_foo.copy_of_name()
es una prvalue , porque copy_of_name
devuelve un objeto (std::string
), no una referencia. Cada prvalue también es un valor r. (Rvalues son más generales.)
La expresión some_foo.original_name()
es un lvalue, porque original_name
devuelve una referencia de lvalue (std::string&
). Cada lvalue también es un glvalue. (Glvalues son más generales.)
La expresión std::move(some_name)
es un xValue, porque std::move
devuelve una referencia de rvalue (std::string&&
). Cada xvalue también es tanto un glvalue como un rvalue.
Tenga en cuenta que nombres para los objetos y las referencias son siempre lvalues:
std::string a;
std::string& b;
std::string&& c;
Teniendo en cuenta las declaraciones anteriores, las expresiones a
, y b
c
son lvalues.
"ejemplos de la vida real"? ¿Quiere decir como detectar un xvalor en el supermercado o preguntarse si su auto puede clasificarse como lvalue? – jalf
jeje, lo que quise decir es ejemplos prácticos –