std::move() и xvalue в C++
Может кто-нибудь дать мне "ациклическое" определение / объяснение поведения xvalue и std:: move ()?
Я посмотрел на страницу cppreference, и там написано, что "std:: move () создает xvalue". (Хорошо)
Затем я искал определение "xvalue" и первое, что он говорит, это вызов функции или перегруженное выражение оператора, такое как "std: move". (???)
2 ответа
std::move()
преобразует выражение из lvalue или rvalue в xvalue.
Lvalue - это объект, занимающий некоторое место в памяти, тогда как rvalue временно занимает память.
int main() {
int x = 3 + 4;
std::cout << x << std::endl;
}
В приведенном выше примере x
это lvalue и 3 + 4
это значение. Теперь посмотрим x
не временно 3 + 4
Выражение является временным значением.
Теперь рассмотрим, что вы делаете это: int y = x;
, У вас есть две копии этого x
в памяти верно?
Проверьте пример ниже:
swap(int &a, int &b) {
int tmp = a; // Two copies of a; one of them is tmp
a = b; // Two copies of b; one of them is a
b = tmp; // Two copies of tmp; one of them is b
}
Проверьте приведенный ниже пример, используя std::move()
:
swap(int &a, int &b) {
int tmp = std::move(a); // tmp is an xvalue
a = std::move(b);
b = std::move(tmp);
}
Вы не копируете; Вы перемещаете их куда-нибудь вместо этого. На самом деле, вы передаете содержание этого в течение некоторого времени. Они скоро будут уничтожены. Они сейчас xvalue
с:)
В этом предложении нет циклического определения.
Следующие выражения являются выражениями xvalue:
вызов функции или перегруженное выражение оператора, тип возвращаемого значения которого является rvalue ссылкой на объект, такой как std:: move (x);
...
Вот std::move
это всего лишь пример, суть в том, что "тип возвращаемого значения - ссылка на значение". Поскольку функция, возвращающая ссылку на rvalue, не очень обычна, в то время как std::move
нацелен на то, чтобы служить хорошим примером. Это подпись std::move
:
template< class T >
constexpr typename std::remove_reference<T>::type&& move( T&& t ) noexcept;
чье возвращаемое значение должно быть ссылкой на rvalue.