Что они имеют в виду, имея идентичность, но не перемещаемую для Lvalue в C++ 11?

Сейчас я изучаю C++ 11 и смущаюсь категорией значений выражений в C++ 11. Согласно терминологии, Lvalue - это верхняя левая точка W, то есть iM (или иногда im) означает, что "имеет тождество, но не может быть перемещено". от". Это действительно меня смущает. Пожалуйста, рассмотрите пример ниже:

#include <iostream>

int main()
{
    int a = 0, b = 1, c = 2;
    a = std::move(b = c);
    std::cout << a << '\n';
}

Этот пример скомпилирован хорошо.

Мы все знаем, что задание b = c Lvalue тогда, что они подразумевают под "не может быть удален"? Пожалуйста, приведите примеры, которые могут ясно это проиллюстрировать!

Спасибо!

1 ответ

Решение

Грубо говоря:

  • lvalue имеет идентичность, потому что вы можете взять его адрес

    int x;
    &x; // ok
    
  • Невозможно переместить lvalue, потому что его нельзя использовать в качестве аргумента для перемещения конструктора / присваивания

    struct Foo 
    {
        Foo(Foo&);  // 0
        Foo(Foo&&); // 1
    };
    
    Foo x;
    Foo y{x}; // calls 0, not 1
    

    в приведенном выше примере x является lvalue: конструктор копирования вызывается. Если вы хотите перейти от x, вы должны сделать это значением: вот почему вы должны использовать std::move(x) чтобы привести его к ссылке.

    Foo y{std::move(x)}; // calls 1
    

В вашем примере std::move(b = c) это значение, как std::move буквально просто static_cast к значению ссылки.

Другие вопросы по тегам