что на самом деле делает std::move
От: Hard_Club  
Дата: 01.03.15 14:55
Оценка:
Есть ли какая-то разница между данными фрагментами кода?

std::vector<int> vr = std::move(v);



std::vector<int> vr = (std::vector<int> &&)v;


std::move только инкапсулирует данное преобразование или делает что-то еще в других случаях?
Re: что на самом деле делает std::move
От: niXman Ниоткуда https://github.com/niXman
Дата: 01.03.15 15:10
Оценка:
только каст.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[2]: что на самом деле делает std::move
От: niXman Ниоткуда https://github.com/niXman
Дата: 01.03.15 15:14
Оценка: 1 (1)
Здравствуйте, niXman, Вы писали:

X>только каст.

в чем можно убедиться тут.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[3]: что на самом деле делает std::move
От: Hard_Club  
Дата: 01.03.15 16:56
Оценка:
Здравствуйте, niXman, Вы писали:

X>Здравствуйте, niXman, Вы писали:


X>>только каст.

X>в чем можно убедиться тут.

каст к rvalue ref?
Re[4]: что на самом деле делает std::move
От: niXman Ниоткуда https://github.com/niXman
Дата: 01.03.15 17:04
Оценка:
Здравствуйте, Hard_Club, Вы писали:

H_C>каст к rvalue ref?

а что вы в коде видите? зачем переспрашивать?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Отредактировано 01.03.2015 17:06 niXman . Предыдущая версия .
Re[5]: что на самом деле делает std::move
От: Hard_Club  
Дата: 01.03.15 17:18
Оценка:
Здравствуйте, niXman, Вы писали:

X>Здравствуйте, Hard_Club, Вы писали:


H_C>>каст к rvalue ref?

X>а что вы в коде видите? зачем переспрашивать?

там просто несколько вариантов
Re: что на самом деле делает std::move
От: jazzer Россия Skype: enerjazzer
Дата: 02.03.15 03:49
Оценка: 5 (3)
Здравствуйте, Hard_Club, Вы писали:

H_C>Есть ли какая-то разница между данными фрагментами кода?

разницы нет (если исключить возможность специализации std::move, конечно).

В двух словах — lvalue не кастится автоматом к rvalue ref, потому что rvalue ref обычно означает, что объект, на который она указывает, будет разрушен.
A x;
A&& rvx = x;
void f(A&& x);
// f(x); // в результате такого вызова х может быть разрушен - не скомпилируется
f(rvx); // тут все хорошо - мы явно передаем rvalue ref
// теперь состояние х, скорее всего, полумертвое (зависит от того, что с ним сделали внутри f)

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

ЗЫ под разрушением я имею в виду состояние moved-from, а не деструктор. Обычно это состояние позволяет оживить объект присваиванием/перемещением в него (но это правило хорошего тона, а не требование языка).
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: что на самом деле делает std::move
От: Hard_Club  
Дата: 02.03.15 09:30
Оценка:
J>ЗЫ под разрушением я имею в виду состояние moved-from, а не деструктор. Обычно это состояние позволяет оживить объект присваиванием/перемещением в него (но это правило хорошего тона, а не требование языка).

Вот теперь все понятно! Только не понятно чего надо делать в конце методов return std::move(tempi) — по идее тут компилятор может сам принять решение перемещать или нет.
Re[3]: что на самом деле делает std::move
От: jazzer Россия Skype: enerjazzer
Дата: 02.03.15 10:27
Оценка:
Здравствуйте, Hard_Club, Вы писали:

J>>ЗЫ под разрушением я имею в виду состояние moved-from, а не деструктор. Обычно это состояние позволяет оживить объект присваиванием/перемещением в него (но это правило хорошего тона, а не требование языка).


H_C>Вот теперь все понятно! Только не понятно чего надо делать в конце методов return std::move(tempi) — по идее тут компилятор может сам принять решение перемещать или нет.


Если ты говоришь о возврате локального объекта (телепатия из имени tempi) — не надо делать никаких std::move, просто возвращай его как есть, компилятор все сделает за тебя (и вообще, скорее всего, просто применит copy elision).
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: что на самом деле делает std::move
От: placement_new  
Дата: 02.03.15 11:27
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Если ты говоришь о возврате локального объекта (телепатия из имени tempi) — не надо делать никаких std::move, просто возвращай его как есть, компилятор все сделает за тебя (и вообще, скорее всего, просто применит copy elision).


И делать в конце std::move даже скорее вредно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.