Что делает std::move() с lvalues?
std::move() — мощный инструмент на языке C, облегчающий идеальная пересылка. Однако на первый взгляд его реализация может вызвать удивление. Чтобы прояснить, как std::move() достигает этого, давайте углубимся в тонкости его реализации.
Понимание функции «Перемещение»
Начнем с упрощенная версия шаблона функции «переместить»:
templatetypename remove_reference ::type&& move(T&& arg) { return static_cast ::type&&>(arg); }
Случай 1: передача Rvalue
Когда std::move() вызывается с rvalue (временным объектом или выражением, результатом которого является rvalue) шаблон перемещения создается следующим образом:
// move with [T = Object]: remove_reference
Поскольку remove_reference
Object&& move(Object&& arg) { return static_cast
Как и ожидалось, функция просто приводит свой аргумент rvalue к ссылке на rvalue.
Случай 2: передача Lvalue
А теперь самое интересное случае возникает, когда std::move() вызывается с lvalue (именованной переменной или выражением, результатом которого является lvalue).
Object a; // a is lvalue Object b = std::move(a);
На этот раз шаблон перемещения создает экземпляр:
// move with [T = Object&] remove_reference
Опять же, remove_reference
Object&& move(Object& && arg) { return static_cast
На первый взгляд это кажется нелогичным, поскольку мы передали lvalue. Однако в C 11 представлена концепция свертывания ссылок, которая изменяет интерпретацию синтаксиса ссылок:
Согласно этим правилам, Object& && фактически ведет себя как Object&, обычная ссылка на lvalue, которая может быть привязана к lvalue.
Поэтому окончательная форма функции выглядит следующим образом:
Object&& move(Object& arg) { return static_cast
По сути, std::move() преобразует аргумент lvalue к ссылке rvalue, обеспечивая идеальную пересылку независимо от типа входных данных.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3