Rvalue-ссылка
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Кто-нибудь может внятно «на пальцах» рассказать что такое rvalue-ссылка?
Конструктор перемещения, оператор перемещения — читал, monkey-код написать могу. Но не могу уловить суть.
Вот, например, указатель — понятно, в переменной хранится адрес, где лежат данные.
Ссылка — более-менее понятно, в переменной тоже хранится адрес, но обращаемся к ней как будто там хранятся сами данные. Т.е без разыменования.
А вот что такое T&& — не понимаю. Объясните?
Назовите проблемы, присущие lvalue-ссылкам.
Вот для решения части этих проблем и ввели еще rvalue-ссылки.
Давайте взглянем на пару проблем lvalue-ссылок.
void foo(const std::vector<int> ©_vec) {
//Выполняем обработку. Работаем именно с копией.
//Оригинальный вектор не должен изменяться, он нам еще может понадобиться.
//Или его можно изменять, потому что он больше не нужен в вызывающем коде?
//Нужен или нет? Вот в чем вопрос.
}
struct T
{
//...
T(NonCopyableObject &x_): x(x_) {}//Не копируемый объект должен поступать извне.
NonCopyableObject x;//Его нельзя будет заиметь себе, он же не копируемый.
};
Обе проблемы решают rvalue-ссылки.
Rvalue-ссылки — это такие же ссылки как и lvalue.
Так что и относиться к ним нужно как к ссылкам.
Ссылка — это ссылка, не важно rvalue она или lvalue.
Но rvalue-ссылка как бы «говорит», что объект,
на который она ссылается больше не нужен,
можно захапать себе его ресурсы,
вместо того, чтобы копировать.
Примерчик:
С оператором присваивания тоже самое,
только еще текущий объект нужно будет почистить.
Итого, rvalue-ссылки служат для того,
чтобы показать, что объект больше не нужен.
Спасибо. Кое-что стало понятнее. Но
вот это как-то мутненько. Как компилятор решает когда применить оператор присваивания, а когда оператор перемещения? То же и с конструкторами копии и перемещения.
Ну так исходя из выражения выбирается соответствующая перегрузка.
Не будем углубляться в категории выражений,
Например:
http://rextester.com/UFD41037
С конструкторами и операторами — тоже самое.
В зависимости от того, что Вы передаете,
будет выбрана та или иная перегрузка.
Спасибо за ответ. Вроде что-то начинает проясняться.