2011-07-07 10 views
42

Me preguntaba si alguien podría contar o explicar algunos ejemplos de la vida real de xvalues, glvalues ​​y prvalues ​​?. He leído una pregunta similar:ejemplos de vida real de xvalues, glvalues ​​y prvalues?

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

pero yo no entendía lo que significaba todo el mundo. ¿Alguien puede explicar en qué casos estos valores son importantes y cuándo uno debería usarlos?

+14

"ejemplos de la vida real"? ¿Quiere decir como detectar un xvalor en el supermercado o preguntarse si su auto puede clasificarse como lvalue? – jalf

+0

jeje, lo que quise decir es ejemplos prácticos –

Respuesta

46

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_namedevuelve 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_namedevuelve 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::movedevuelve 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 bc son lvalues.

+0

¿Se puede explicar cuándo se debe utilizar la referencia de valor? –

+0

@ M3taSpl0it: los constructores de movimiento y los operadores de asignación de movimiento tienen parámetros de referencia de valor real. Aparte de eso, hay poco uso para ellos. La mayoría de las veces, están enterrados en el interior del código de la biblioteca, y su propio código no necesita molestarse con las referencias de valores. – fredoverflow

+0

Falta un ejemplo fundamentalmente importante. Una función que devuelve una referencia cv-calificada: 'std :: string const & reference_of_name() const'. Esto sería un prvalue, ¿verdad? –

Cuestiones relacionadas