Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
6 / 4 / 2
Регистрация: 01.10.2020
Сообщений: 37

std::move()

15.07.2021, 21:46. Показов 1337. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Хочу разобраться с функцией std::move(). Код, приведенный ниже работает как и ожидается, значение в переменной str перемещается.
C++
1
2
3
4
5
    vector<string> vec2 = { "1","2","3","4" };
    string str = "5";
    vec2.push_back(move(str));
    copy(vec2.begin(), vec2.end(), ostream_iterator<string>(cout, " "));
    cout << endl << str << endl;//Выводит только 2 переноса строки
Но сейчас приведу код, результат выполнения которого мне не ясен, прошу пояснить почему значение в vec[0] остается таким же.
C++
1
2
3
4
5
    vector<int> vec = { 1,2,3,4,5 };
    vec.push_back(move(vec[0]));
    copy(vec.begin(), vec.end(), ostream_iterator<int>(cout, " "));
    cout << endl << vec[0] << endl
    //Единица не перемещается, а остается как в начале вектора, так и добавляется в конец. Почему?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.07.2021, 21:46
Ответы с готовыми решениями:

std::move()
Есть ли разница между следующими вещами: A = std::move(B); // and std::copy(B.begin(), B.end(), A.begin()); B.clear();

Std::move
Добрый вечер, #include &lt;iostream&gt; using namespace std; class A { private: int x = 10; public: A(int q){ x = q; }

Функция std::move()
struct DotPosition { long x; long y; }; std::vector&lt;DotPosition&gt; dots; DotPosition dot; dot.x = x; dot.y = y; ...

2
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12942 / 6809 / 1821
Регистрация: 18.10.2014
Сообщений: 17,234
15.07.2021, 22:32
Цитата Сообщение от cndfn Посмотреть сообщение
прошу пояснить почему значение в vec[0] остается таким же.
А почему бы и нет? Откуда мог возникнуть такой вопрос? В общем случае, если из объекта выполнено перемещение, то, если не оговорено отдельно, принято полагать, что с ним может произойти что угодно: он может потерять значение, он может сохранить значение, он может поменять значение - что угодно. Объект должен остаться "живым", но его значение может потеряться (а может и не потеряться).

У вас в вашем случае речь идет о объекте типа int. Для объекта типа int, как и для любого скалярного типа, семантика перемещения оговорена четко в стандарте языка: перемещение - это просто копирование. Вот вы и получили обыкновенное копирование. Исходное значение при копировании не меняется. Почему вас это удивляет?

Значения плоских/одноуровневых объектов невозможно как-то физически "переместить". Их можно только скопировать. Если вы как-то иначе себе представляли перемещение для скалярных объектов - то расскажите нам об этом. Как иначе вы себе представляете перемещение для объектов типа int? Почему вы ожидаете, что значение поменяется? Зачем ему меняться?

Добавлено через 4 минуты
Цитата Сообщение от cndfn Посмотреть сообщение
//Единица не перемещается, а остается как в начале вектора, так и добавляется в конец. Почему?
Ым... А эти ожидания откуда? Семантика перемещения не занимается созданием/удалением/переупорядочением элементов контейнеров. Они не имеет вообще никакого отношения к этому. Семантика перемещения - это перемещение значения объекта. Сам объект (элемент контейнера) при этом никуда не девается - он остается там, где был, в начале вектора.

И непонятно, почему вы сравниваете два разных по сути примера. Почему у вас в первом примере не делается vec.push_back(move(vec[0]));, как это делается во втором? Если бы вы это сделали и в первом примере, то вы бы увидели что там первый элемент вектора тоже остался на своем месте, в начале вектора. Из него бы "ушло" значение (а может и не ушло бы), но сам он бы никуда не делся.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
15.07.2021, 23:04
Цитата Сообщение от cndfn Посмотреть сообщение
разобраться с функцией std::move(). Код, приведенный ниже работает как и ожидается, значение в переменной str перемещается.
функция std::move, вопреки своему названию,
никого никуда не перемещает.

функция получает на входе любой объект,
а на выходе возвращает rvalue-reference на этот же самый объект.

фактически получается, что функция говорит компилятору:
считай, что вот этот вот объект - временный.

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

то есть, например вот здесь:
Цитата Сообщение от cndfn Посмотреть сообщение
vec.push_back(move(vec[0]));
непосредственно перемещением занимается push_back
в то время как move(vec[0]) лишь возвращает якобы временный объект.


при этом важно понимать:
бизнес-логика перемещающих функций может быть какой угодно.
вот что ты сам напишешь, то и будет.

типичная реализация предполагает перемещение только тех классовых объектов,
для которых реализованы конструкторы перемещения.

в отличие от класса строк, у обычного int нет конструктора перемещения.
поэтому, его в принципе невозможно переместить.
можно только скопировать.


а с другой стороны:
просто подумай, и ответь на вопрос:
а нафига вообще его куда-то перемещать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.07.2021, 23:04
Помогаю со студенческими работами здесь

Optional и std::move
добрый день. разбираясь в исходниках optional'а из gcc, я понял, что там нигде не делается инвалидным только что перемещенный объект. ...

emplace и std::move
есть код для чтения кадров с камеры , нахождения лица и вывода этого всего на экран. #include &lt;opencv2/opencv.hpp&gt; #include...

Немного не понимаю std::move
Здравствуйте, я немного не понимаю работу кода на 150-155 строках здесь: #include &lt;iostream&gt; #include &lt;memory&gt; ...

std::move тормозит процесс
Привет, слушал конференцию Антона Полухина, в один момент он сказал что std::move при извлечении последнего элемента из вектора будет...

Func(std::move(.) копирует ?
Здравствуйте, имеется следующий код: void foo(std::vector&lt;int&gt;&amp;&amp; v) { std::cout &lt;&lt; &quot;vector is taken&quot; &lt;&lt; std::endl; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru