Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
2 / 2 / 1
Регистрация: 28.09.2013
Сообщений: 253
1

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

19.03.2016, 00:41. Просмотров 3311. Ответов 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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.03.2016, 00:41
Ответы с готовыми решениями:

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

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

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

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

23
159 / 151 / 92
Регистрация: 18.11.2015
Сообщений: 677
19.03.2016, 01:13 2
Цитата Сообщение от 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;
}
0
Миниатюры
Что происходит когда std::move применяется для int?  
2 / 2 / 1
Регистрация: 28.09.2013
Сообщений: 253
19.03.2016, 01:32  [ТС] 3
Это студия? У меня все работает в minGW. Вы хоть с++11 включили?
0
4289 / 3007 / 1304
Регистрация: 09.05.2015
Сообщений: 7,419
19.03.2016, 02:03 4
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 5
vab9petryk, в 15 студии не работает...
А происходит только то, что std::move возвращает rvalue reference и ничего больше, если не ошибаюсь
1
С чаем беда...
Эксперт CЭксперт С++
7860 / 3790 / 1040
Регистрация: 18.10.2014
Сообщений: 8,051
19.03.2016, 02:28 6
Цитата Сообщение от 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
DrOffset
19.03.2016, 02:31
  #7

Не по теме:

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

0
С чаем беда...
Эксперт CЭксперт С++
7860 / 3790 / 1040
Регистрация: 18.10.2014
Сообщений: 8,051
19.03.2016, 02:33 8
Лучший ответ Сообщение было отмечено 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 9
TheCalligrapher, нашел ошибку. Имена переменных были одинаковые.
Только странно, что студия выдает 'int &&' differs in levels of indirection from 'int', а не 'refNum': redefinition; multiple initialization
0
С чаем беда...
Эксперт CЭксперт С++
7860 / 3790 / 1040
Регистрация: 18.10.2014
Сообщений: 8,051
19.03.2016, 02:39 10
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Какое-то "делание" с этим rvalue reference будет производить уже тот, кому это rvalue reference будет передано дальше.
При этом никто не заставляет вас делать какие-то разрушительные действия по отношению к исходному объекту. Например, никто не запрещает вам реализовать перемещающий конструктор как копирующий конструктор.
0
Эксперт С++
8164 / 3766 / 809
Регистрация: 15.11.2014
Сообщений: 8,549
19.03.2016, 16:36 11
Цитата Сообщение от vab9petryk Посмотреть сообщение
Что делает std::move с переменной num?
лишает объект имени, что б компилятор решил, что объект - временный.
Поясните по move конструктору
1
14 / 14 / 0
Регистрация: 10.01.2017
Сообщений: 821
29.10.2019, 19:16 12
Цитата Сообщение от hoggy Посмотреть сообщение
лишает объект имени, что б компилятор решил, что объект - временный.
Поясните по move конструктору
А для чего нужно, чтобы компилятор думал, что объект временный ? Для какой цели используется временный объект по сравнению с конкретным объектом, который имеет конкретный адрес в памяти ?
0
С чаем беда...
Эксперт CЭксперт С++
7860 / 3790 / 1040
Регистрация: 18.10.2014
Сообщений: 8,051
29.10.2019, 19:21 13
Цитата Сообщение от Optimus11 Посмотреть сообщение
А для чего нужно, чтобы компилятор думал, что объект временный ? Для какой цели используется временный объект по сравнению с конкретным объектом, который имеет конкретный адрес в памяти ?
"Адрес в памяти" от std::move никак не меняется. Результат std::move привязан к тому же самому адресу в памяти. что и аргумент.

"Компилятор думал, что объект временный" - это неформальный (и не совсем корректный) способ сказать, "чтобы компилятор думал, что объект является xvalue". Xvalue - это значение, которое обозначает объект, находящийся в конце своей жизни. Так как объект находится в конце своей жизни, его ресурсы можно переиспользовать для других целей (вместо того, чтобы просто уничтожить). Например, переместить их в другой объект. Вот таким образом std::move разрешает перемещение.
2
зомбяк
1410 / 1075 / 309
Регистрация: 14.05.2017
Сообщений: 3,516
29.10.2019, 19:22 14
Optimus11, например у тебя объект с динамически выделенными данными в куче (например тот же std::string, хранящий там строку ). Тебе надо, чтобы эти данные без перевыделения в новом месте и перекопирования из старого места кучи в новое оказались у нового объекта. Вызываешь конструктор перемещения, и у старой std::string отбирают эти данные в куче и передают другой строке. Взамен создаётся выделение для пустой строки.
Для иных случаев конструктор перемещения бесполезен.
1
14 / 14 / 0
Регистрация: 10.01.2017
Сообщений: 821
29.10.2019, 19:35 15
Цитата Сообщение от TRam_ Посмотреть сообщение
Optimus11,...Тебе надо, чтобы эти данные без перевыделения в новом месте и перекопирования из старого места кучи в новое оказались у нового объекта. .
Я решительно не могу понять

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

Добавлено через 1 минуту
А "указатель, указывающий в никуда" при попытке использования приведёт к вылету программы.
1
Evg
Эксперт CАвтор FAQ
21121 / 8137 / 628
Регистрация: 30.03.2009
Сообщений: 22,455
Записей в блоге: 30
29.10.2019, 19:42 17
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
std::move - это не более чем приведение типа - к соответствующему типу &&, т.е. к rvalue reference
Если obj - это объект типа type, то выражения "std::move(obj)" и "(type&&)obj" - это одно и то же?
0
14 / 14 / 0
Регистрация: 10.01.2017
Сообщений: 821
29.10.2019, 19:44 18
Цитата Сообщение от TRam_ Посмотреть сообщение
Создание данных в куче и удаление этих данных - очень медленные операции. Их всюду стремятся избежать.
А на чем или как тогда реализовано std move, что оно быстрее создания указателя ?
Цитата Сообщение от TRam_ Посмотреть сообщение
А "указатель, указывающий в никуда" при попытке использования приведёт к вылету программы.
А почему в никуда, на адресс обьекта, в данном случае на примере на string.
0
Грамотный. Безпорно.
16787 / 9683 / 1869
Регистрация: 27.09.2012
Сообщений: 24,031
Записей в блоге: 2
29.10.2019, 20:18 19
Цитата Сообщение от 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Эксперт С++
7860 / 3790 / 1040
Регистрация: 18.10.2014
Сообщений: 8,051
29.10.2019, 20:42 20
Цитата Сообщение от Evg Посмотреть сообщение
Если obj - это объект типа type, то выражения "std::move(obj)" и "(type&&)obj" - это одно и то же?
Да, одно и то же. Если type - это именно объектный тип.

(В общем случае, если type может быть и ссылочным типом, то эквивалентность нарушается и более правильно говорить, что std::move(obj) - это (remove_reference_t<type>&&) obj, как заметил Croessmah)
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.10.2019, 20:42

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Что означает 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...

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.