Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Есть в C++ два типа ссылок: обычная & и rvalue &&. Если объект передаётся по rvalue-ссылке, то это значит, что вызывающий код отказывается от владения объектом, и функция может делать с ним всё, что ей хочется. Ну а с помощью std::move мы сообщаем об этом намерении явно.
- vector<int> fun1(vector<int> vc) {
- return vc; // возвращаем rvalue
- }
- vector<int> fun2(vector<int>& vc) {
- return vc; // возвращаем копию vc в rvalue
- }
- vector<int> fun3(vector<int>&& vc) {
- return vc; // возвращаем rvalue
- }
- vector<int>& fun4(vector<int>& vc) {
- return vc; // возвращаем vc по ссылке
- }
- int main() {
- vector<int> A = {1, 2, 3};
- // 1 При вызове функции мы копируем вектор A и передаем в vc
- auto b1 = fun1(A);
- // 2 При вызове функции мы передаем A по ссылке, но при return копируем A и возвращаем копию
- auto b2 = fun2(A);
- // 3 При вызове функции мы передаем A по rvalue ссылке, после выполнения функции fun3 вектор A будет пуст
- auto b3 = fun3(std::move(A));
- // 4 При вызове функции мы передаем A по ссылке, return возвращает А тоже по ссылке, но при = мы копируем A
- auto b4 = fun4(A);
- // 5 При вызове функции мы передаем A по ссылке, return возвращает А тоже по ссылке и прирывниваем по ссылке. Получается в b4 и А - это один и тот же вектор
- auto& b5 = fun4(A);
- // 6 При вызове функции мы передаем A по ссылке, return возвращает А тоже по ссылке, но мы муваем значение в b6. После приравнивания вектор A будет пуст
- auto b6 = std::move(fun4(A));
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement