0Pricing
C++ Academy · Урок

Ссылки rvalue и синтаксис &&

Привязывайтесь к временным объектам с помощью ссылок rvalue для эффективной передачи ресурсов.

«Ссылки rvalue и синтаксис &&» — бесплатный урок C++ Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.

Синтаксис &&

Ссылка на правостороннее значение объявляется с помощью T&&. Она связывается только с правосторонними значениями — временными объектами, которые скоро будут уничтожены.

int&& ref = 42;          // OK: binds to literal
int x = 10;
// int&& bad = x;        // ERROR: x is an lvalue

Зачем нужны ссылки на правосторонние значения

Они позволяют писать функции, которые знают, что аргумент скоро будет уничтожен. Можно забрать его ресурсы, не создавая копию.

Перегрузка функции по типу ссылки

Функцию можно перегрузить для T& и T&&. Компилятор выбирает подходящий вариант на основе категории аргумента.

void process(std::string& s) { std::cout << "lvalue\n"; }
void process(std::string&& s) { std::cout << "rvalue\n"; }

std::string s = "hi";
process(s);            // lvalue
process("temp");       // rvalue
process(std::move(s)); // rvalue

Именованные ссылки на правосторонние значения становятся левосторонними значениями

После присвоения имени ссылке на правостороннее значение это имя само становится левосторонним значением — его идентичность фиксируется. Используйте std::move, чтобы восстановить свойства правостороннего значения.

void f(std::string&& s) {
    // inside f, the parameter s is an lvalue
    g(s);              // passes s by lvalue
    h(std::move(s));   // passes s as an rvalue
}

std::move — это приведение типа

std::move(x) сам по себе ничего не перемещает — это приведение типа, возвращающее x как ссылку на правостороннее значение. Фактическое перемещение происходит в принимающем конструкторе.

// equivalent to
static_cast<std::string&&>(s)

Почему это называется перемещением

Название отражает типичное использование — передачу объекта, содержимое которого нужно забрать, — но само по себе это ничего не передаёт.

Универсальные ссылки (передающие ссылки)

Когда T&& появляется в шаблоне с выводимым типом T, это передающая ссылка — она связывается и с левосторонними, и с правосторонними значениями, сохраняя их категорию.

template <typename T>
void wrapper(T&& arg) {
    process(std::forward<T>(arg));
}

Свёртка ссылок

Когда ссылки комбинируются в шаблонах, язык сворачивает их:

  • T& & → T&
  • T& && → T&
  • T&& & → T&
  • T&& && → T&&

Когда не следует использовать перемещение

Для тривиально копируемых типов (int, double, указатель) перемещение эквивалентно копированию. Вызов std::move не даёт преимуществ и может запутать читателей.

Перемещение без владения ресурсами

Для типов без ресурсов в куче конструктор перемещения совпадает с конструктором копирования. Перемещение полезно только для типов, владеющих динамической памятью.

Распространённый подводный камень: перемещение из const

std::move для константного объекта ничего не делает — конструктор перемещения нельзя вызвать для const, поскольку ему пришлось бы изменить исходный объект.

Быстрая проверка

Что на самом деле делает std::move(x)?

Итоги

T&& связывается с правосторонними значениями. Именованные ссылки на правосторонние значения становятся левосторонними — используйте std::move, чтобы восстановить исходную категорию. T&& в шаблоне является передающей ссылкой. std::move — это приведение типа, а не само перемещение.

Часто задаваемые вопросы

Урок «Ссылки rvalue и синтаксис &&» бесплатный?

Да — полный текст урока «Ссылки rvalue и синтаксис &&» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.

Чему я научусь в уроке «Ссылки rvalue и синтаксис &&»?

Привязывайтесь к временным объектам с помощью ссылок rvalue для эффективной передачи ресурсов. Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C++ Academy?

Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Ссылки rvalue и синтаксис &&»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C++ Academy?

Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Lvalue и rvalue: различие
  2. Ссылки rvalue и синтаксис &&
  3. std::move и std::forward
  4. Конструкторы перемещения и присваивание перемещением
← Назад к C++ Academy