Подтвердить что ты не робот

Примеры реальной жизни xvalues, glvalues ​​и prvalues?

Мне было интересно, могут ли кто-нибудь рассказать или объяснить некоторые примеры реальной жизни xvalues, glvalues ​​и prvalues ​​?. Я прочитал аналогичный вопрос:

Что такое rvalues, lvalues, xvalues, glvalues ​​и prvalues?

но я не понимал, что все подразумевают. Может ли кто-нибудь объяснить, в каких случаях эти значения важны и когда их следует использовать?

4b9b3361

Ответ 1

Рассмотрим следующий класс:

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 также является rvalue. (Rvalues ​​являются более общими.)

Выражение some_foo.original_name() является lvalue, потому что original_name возвращает ссылку lvalue (std::string&). Каждое lvalue также является значением glvalue. (Glvalues ​​более общие.)

Выражение std::move(some_name) является xvalue, потому что std::move возвращает ссылку rvalue (std::string&&). Каждое значение x также является значением glvalue и rvalue.


Обратите внимание, что имена для объектов и ссылок всегда lvalues:

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

Учитывая приведенные выше выражения, выражения a, b и c являются lvalues.