Что они имеют в виду, имея идентичность, но не перемещаемую для 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
к значению ссылки.