«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как std::move() обрабатывает значения L в C++?

Как std::move() обрабатывает значения L в C++?

Опубликовано 13 ноября 2024 г.
Просматривать:506

How Does std::move() Handle Lvalues in C  ?

Что делает std::move() с lvalues?

std::move() — мощный инструмент на языке C, облегчающий идеальная пересылка. Однако на первый взгляд его реализация может вызвать удивление. Чтобы прояснить, как std::move() достигает этого, давайте углубимся в тонкости его реализации.

Понимание функции «Перемещение»

Начнем с упрощенная версия шаблона функции «переместить»:

template 
typename remove_reference::type&& move(T&& arg)
{ return static_cast::type&&>(arg); }

Случай 1: передача Rvalue

Когда std::move() вызывается с rvalue (временным объектом или выражением, результатом которого является rvalue) шаблон перемещения создается следующим образом:

// move with [T = Object]:
remove_reference::type&& move(Object&& arg)
{ return static_cast::type&&>(arg); }

Поскольку remove_reference преобразует Object в Object, в итоге мы получаем:

Object&& move(Object&& arg) { return static_cast(arg); }

Как и ожидалось, функция просто приводит свой аргумент rvalue к ссылке на rvalue.

Случай 2: передача Lvalue

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

Object a; // a is lvalue
Object b = std::move(a);

На этот раз шаблон перемещения создает экземпляр:

// move with [T = Object&]
remove_reference::type&& move(Object& && arg)
{ return static_cast::type&&>(arg); }

Опять же, remove_reference преобразует Object& в Object, в результате чего получается:

Object&& move(Object& && arg) { return static_cast(arg); }

На первый взгляд это кажется нелогичным, поскольку мы передали lvalue. Однако в C 11 представлена ​​концепция свертывания ссылок, которая изменяет интерпретацию синтаксиса ссылок:

  • Object & & = Object &
  • Object & & && = Объект &
  • Объект & && & = Объект &
  • Объект & && & && = Объект & &&

Согласно этим правилам, Object& && фактически ведет себя как Object&, обычная ссылка на lvalue, которая может быть привязана к lvalue.

Поэтому окончательная форма функции выглядит следующим образом:

Object&& move(Object& arg) { return static_cast(arg); }

По сути, std::move() преобразует аргумент lvalue к ссылке rvalue, обеспечивая идеальную пересылку независимо от типа входных данных.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3