Advertisement
CyberN00b

Untitled

Oct 31st, 2023 (edited)
514
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.19 KB | None | 0 0
  1. Есть в C++ два типа ссылок: обычная & и rvalue &&. Если объект передаётся по rvalue-ссылке, то это значит, что вызывающий код отказывается от владения объектом, и функция может делать с ним всё, что ей хочется. Ну а с помощью std::move мы сообщаем об этом намерении явно.
  2.  
  3.  
  4. vector<int> fun1(vector<int> vc) {
  5.     return vc; // возвращаем rvalue
  6. }
  7.  
  8. vector<int> fun2(vector<int>& vc) {
  9.     return vc; // возвращаем копию vc в rvalue
  10. }
  11.  
  12. vector<int> fun3(vector<int>&& vc) {
  13.     return vc; // возвращаем rvalue
  14. }
  15.  
  16. vector<int>& fun4(vector<int>& vc) {
  17.     return vc; // возвращаем vc по ссылке
  18. }
  19.  
  20. int main() {
  21.     vector<int> A = {1, 2, 3};
  22.     // 1 При вызове функции мы копируем вектор A и передаем в vc
  23.     auto b1 = fun1(A);
  24.     // 2 При вызове функции мы передаем A по ссылке, но при return копируем A и возвращаем копию
  25.     auto b2 = fun2(A);
  26.     // 3 При вызове функции мы передаем A по rvalue ссылке, после выполнения функции fun3 вектор A будет пуст
  27.     auto b3 = fun3(std::move(A));
  28.     // 4 При вызове функции мы передаем A по ссылке, return возвращает А тоже по ссылке, но при = мы копируем A
  29.     auto b4 = fun4(A);
  30.     // 5 При вызове функции мы передаем A по ссылке, return возвращает А тоже по ссылке и прирывниваем по ссылке. Получается в b4 и А - это один и тот же вектор
  31.     auto& b5 = fun4(A);
  32.     // 6 При вызове функции мы передаем A по ссылке, return возвращает А тоже по ссылке, но мы муваем значение в b6. После приравнивания вектор A будет пуст
  33.     auto b6 = std::move(fun4(A));
  34. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement