Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.91/34: Рейтинг темы: голосов - 34, средняя оценка - 4.91
 Аватар для vab9petryk
2 / 2 / 1
Регистрация: 28.09.2013
Сообщений: 255

Что происходит когда std::move применяется для int?

19.03.2016, 00:41. Показов 7236. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мне, вроде бы, понятно как работает std::move() на классах типа string. Но мне непонятно что будет в данном случаи.
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
using namespace std;
 
int main()
{
    int num = 5;
    //int refNum = std::move(num);
    //int &&refNum = std::move(num);
    return 0;
}
Что делает std::move с переменной num? Можно ли после std::move(num) использовать num?

Добавлено через 3 минуты
Эквивалентно ли
C++
1
int refNum  = std::move(num); int refNum = num;
C++
1
int &&refNum = std::move(num); int &refNum = num;
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.03.2016, 00:41
Ответы с готовыми решениями:

Std::move что за зверь?
Есть код Acceptor'a: void SocketWorker::doAccept() { mAcceptor.async_accept(mSocket, (boost::system::error_code ec) { if (!ec...

Vector::swap и std::move - что эффективнее?
Пусть имеется пустой вектор A и заполненный некими данными вектор B. Тогда какой из методов более эффективный: A.swap(B); A =...

Объяснить для чего используется ref и out, точнее их значение и когда применяется
Кто может объяснить для чего используется ref и out, точнее их значение и когда применяется. Я много прочитала но ещё больше запуталась. :)

23
 Аватар для meJevin
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677
19.03.2016, 01:13
Цитата Сообщение от vab9petryk Посмотреть сообщение
Мне, вроде бы, понятно как работает std::move() на классах типа string. Но мне непонятно что будет в данном случаи.
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
using namespace std;
 
int main()
{
    int num = 5;
    //int refNum = std::move(num);
    //int &&refNum = std::move(num);
    return 0;
}
Миниатюры
Что происходит когда std::move применяется для int?  
0
 Аватар для vab9petryk
2 / 2 / 1
Регистрация: 28.09.2013
Сообщений: 255
19.03.2016, 01:32  [ТС]
Это студия? У меня все работает в minGW. Вы хоть с++11 включили?
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,569
19.03.2016, 02:03
C++
1
2
3
    int num = 5;
    int refNum = std::move(num);
    printf("%u %u", num, refNum);
и
C++
1
2
3
    int num = 5;
    int &&refNum = std::move(num);
    printf("%u %u", num, refNum);
превращается после компиляции в
C++
1
printf("%u %u", 5, 5);
0
27 / 27 / 18
Регистрация: 13.09.2014
Сообщений: 137
19.03.2016, 02:05
vab9petryk, в 15 студии не работает...
А происходит только то, что std::move возвращает rvalue reference и ничего больше, если не ошибаюсь
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
19.03.2016, 02:28
Цитата Сообщение от notemac Посмотреть сообщение
vab9petryk, в 15 студии не работает...
Что именно и как у вас "не работает"???

Все прекрасно "работает" в 15 студии

C++
1
2
3
4
5
6
7
8
9
#include <utility>
 
int main()
{
    int num = 5;
    int refNum1 = std::move(num);
    int &&refNum2 = std::move(num);
    return 0;
}
0
19.03.2016, 02:31

Не по теме:

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Что именно и как у вас "не работает"???
Товарищи забыли переименовать refNum`ы, у автора в коде они одноименные. В результате этого и "не работает".

0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
19.03.2016, 02:33
Лучший ответ Сообщение было отмечено vab9petryk как решение

Решение

Цитата Сообщение от vab9petryk Посмотреть сообщение
Что делает std::move с переменной num? Можно ли после std::move(num) использовать num?
std::move никогда ни с чем ничего не делает. Ни для int, ни для std::string, ни для чего либо еще. std::move - это не более чем приведение типа - к соответствующему типу &&, т.е. к rvalue reference. И все.

Какое-то "делание" с этим rvalue reference будет производить уже тот, кому это rvalue reference будет передано дальше. Для std::string это будет конструктор перемещения std::string. Именно он выполняет "опустошение" исходного std::string.

Для типа int инициализация с int && в правой части ничего с исходным объектом не делает. Т.е. исходный int остается нетронутым.
3
27 / 27 / 18
Регистрация: 13.09.2014
Сообщений: 137
19.03.2016, 02:37
TheCalligrapher, нашел ошибку. Имена переменных были одинаковые.
Только странно, что студия выдает 'int &&' differs in levels of indirection from 'int', а не 'refNum': redefinition; multiple initialization
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
19.03.2016, 02:39
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Какое-то "делание" с этим rvalue reference будет производить уже тот, кому это rvalue reference будет передано дальше.
При этом никто не заставляет вас делать какие-то разрушительные действия по отношению к исходному объекту. Например, никто не запрещает вам реализовать перемещающий конструктор как копирующий конструктор.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
19.03.2016, 16:36
Цитата Сообщение от vab9petryk Посмотреть сообщение
Что делает std::move с переменной num?
лишает объект имени, что б компилятор решил, что объект - временный.
Поясните по move конструктору
1
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
29.10.2019, 19:16
Цитата Сообщение от hoggy Посмотреть сообщение
лишает объект имени, что б компилятор решил, что объект - временный.
Поясните по move конструктору
А для чего нужно, чтобы компилятор думал, что объект временный ? Для какой цели используется временный объект по сравнению с конкретным объектом, который имеет конкретный адрес в памяти ?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
29.10.2019, 19:21
Цитата Сообщение от Optimus11 Посмотреть сообщение
А для чего нужно, чтобы компилятор думал, что объект временный ? Для какой цели используется временный объект по сравнению с конкретным объектом, который имеет конкретный адрес в памяти ?
"Адрес в памяти" от std::move никак не меняется. Результат std::move привязан к тому же самому адресу в памяти. что и аргумент.

"Компилятор думал, что объект временный" - это неформальный (и не совсем корректный) способ сказать, "чтобы компилятор думал, что объект является xvalue". Xvalue - это значение, которое обозначает объект, находящийся в конце своей жизни. Так как объект находится в конце своей жизни, его ресурсы можно переиспользовать для других целей (вместо того, чтобы просто уничтожить). Например, переместить их в другой объект. Вот таким образом std::move разрешает перемещение.
2
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
29.10.2019, 19:22
Optimus11, например у тебя объект с динамически выделенными данными в куче (например тот же std::string, хранящий там строку ). Тебе надо, чтобы эти данные без перевыделения в новом месте и перекопирования из старого места кучи в новое оказались у нового объекта. Вызываешь конструктор перемещения, и у старой std::string отбирают эти данные в куче и передают другой строке. Взамен создаётся выделение для пустой строки.
Для иных случаев конструктор перемещения бесполезен.
1
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
29.10.2019, 19:35
Цитата Сообщение от TRam_ Посмотреть сообщение
Optimus11,...Тебе надо, чтобы эти данные без перевыделения в новом месте и перекопирования из старого места кучи в новое оказались у нового объекта. .
Я решительно не могу понять

Что за новый обьект, у которого должны оказатся эти данные ?
Чем новый обьект не устроит указатель на данные в куче ?
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
29.10.2019, 19:38
Цитата Сообщение от Optimus11 Посмотреть сообщение
не устроит указатель на данные в куче
Создание данных в куче и удаление этих данных - очень медленные операции. Их всюду стремятся избежать.

Добавлено через 1 минуту
А "указатель, указывающий в никуда" при попытке использования приведёт к вылету программы.
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
29.10.2019, 19:42
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
std::move - это не более чем приведение типа - к соответствующему типу &&, т.е. к rvalue reference
Если obj - это объект типа type, то выражения "std::move(obj)" и "(type&&)obj" - это одно и то же?
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
29.10.2019, 19:44
Цитата Сообщение от TRam_ Посмотреть сообщение
Создание данных в куче и удаление этих данных - очень медленные операции. Их всюду стремятся избежать.
А на чем или как тогда реализовано std move, что оно быстрее создания указателя ?
Цитата Сообщение от TRam_ Посмотреть сообщение
А "указатель, указывающий в никуда" при попытке использования приведёт к вылету программы.
А почему в никуда, на адресс обьекта, в данном случае на примере на string.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
29.10.2019, 20:18
Цитата Сообщение от Evg Посмотреть сообщение
Если obj - это объект типа type, то выражения "std::move(obj)" и "(type&&)obj" - это одно и то же?
template <class T> constexpr remove_reference_t<T>&& move(T&& t) noexcept;
Returns: static_cast<remove_reference_t<T>&&>(t).
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
29.10.2019, 20:42
Цитата Сообщение от Evg Посмотреть сообщение
Если obj - это объект типа type, то выражения "std::move(obj)" и "(type&&)obj" - это одно и то же?
Да, одно и то же. Если type - это именно объектный тип.

(В общем случае, если type может быть и ссылочным типом, то эквивалентность нарушается и более правильно говорить, что std::move(obj) - это (remove_reference_t<type>&&) obj, как заметил Croessmah)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.10.2019, 20:42
Помогаю со студенческими работами здесь

Что означает запись std::int?
Подскажите пожалуйста увидела в одном примере перед вектором было std::int я почему то думала что такое не бывает, скажите пожалуйста если...

Что означает std::string to_string( int value )?
Что означает: std::string to_string( int value )

Как проинициализировать std::stack<const int> obj ( std::stack<int>{} );
добрый день. вопрос в коде: http://rextester.com/VCVVML6656 #include &lt;iostream&gt; #include &lt;stack&gt; //-std=c++14...

На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами
подскажите есть вот такая задача. Есть список . Создать второй список, в котором будут все эти же числа, но не в виде строк, а в виде...

Что происходит, когда мужчина влюблён?
Когда мужчина влюбляется, он начинает делать несвойственные ему вещи: дарить объекту своей любви цветы (даже если раньше никогда такого не...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru