
Constantine
01.06.2017
12:55:15
void foo(const std::string& s) надо написать
и не перемещать

Azoyan
01.06.2017
12:55:26
не, я хочу переместить

Constantine
01.06.2017
12:55:36
зачем?

Google

Александр
01.06.2017
12:55:48
если просто делать std::move() при подстановке аргумента, ничего не произойдёт - передача как по ссылке
а && говорит, что внутри функции следует куда-то переместить

Azoyan
01.06.2017
12:55:54
чтобы понять как работает &&

Constantine
01.06.2017
12:56:14
короче && позволяет получателю поломать объект до состояния, в котором отработает деструктор

Александр
01.06.2017
12:56:17
std::move() никуда ничего не перемещает. он просто приводит тип к type&&
ага. при передаче по обычном ссылке так тоже можно сделать, но это будет неприлично

Constantine
01.06.2017
12:57:07
использовать после первой передачи по std::move объект это завязка на реализацию

reagentoo
01.06.2017
12:57:29

Alex Фэils?︙
01.06.2017
12:57:42

Александр
01.06.2017
12:57:47

reagentoo
01.06.2017
12:57:51
ясно

Alex Фэils?︙
01.06.2017
12:57:54
std::move ничего не перемещает. std::forward ничего не передает.

reagentoo
01.06.2017
12:58:11
вот именно!

Александр
01.06.2017
12:58:26
на эту тему лучше почитать длинные статьи, в двух словах сложно объяснить все детали

Google

Alex Фэils?︙
01.06.2017
12:58:27

reagentoo
01.06.2017
12:58:42
void_t берёт на вход ему не нужное - жадный какой-то

Azoyan
01.06.2017
13:00:00
то есть вот это каноничный вариант: http://cpp.sh/32myb

Constantine
01.06.2017
13:00:01
короче && это все еще ссылка
void do_nothing(std::unique_ptr<int>&& p) {};
void black_hole(std::unique_ptr<int> p) {};
просто пример очень неправильный
функции foo нет смысла делать что-то с объектом
ей достаточно const&

Azoyan
01.06.2017
13:01:24
я хочу чтобы она уничтожила объект

Constantine
01.06.2017
13:01:26
пиши функцию void add_to_vector(std::vector<string> &vector, std::string s)
если ты вызовешь add_to_vector(v, str) то str будет скопирована
если вызовешь add_to_vector(v, std::move(str)) перемещена
перемещение _не обязано_ поломать объект, но почти всегда на самом деле это сделает

Azoyan
01.06.2017
13:02:54
чуваки, я хочу переместить строку вникуда
чтобы она сломалась

Constantine
01.06.2017
13:03:10
нет гарантий, что она сломается
перемещение - это возможность, а не обязанность

Александр
01.06.2017
13:03:51

Azoyan
01.06.2017
13:04:02
тогда он скопирует же

Александр
01.06.2017
13:04:07
мув оставь

Constantine
01.06.2017
13:04:09
нет

Google

Azoyan
01.06.2017
13:04:18
аа, move оставить? Ну ок.

Constantine
01.06.2017
13:04:21
у std::string определен конструктор с string&&
собственно конструктор перемещения

Azoyan
01.06.2017
13:06:25
Так, а для чего && в аргументе функции, если мне всё равно std::move(str) в клиентском коде приходится писать

Constantine
01.06.2017
13:06:39
для того, чтобы различать
если тебе это нужно
например, конструктор перемещения string(string&&) не может быть определен без &&

Azoyan
01.06.2017
13:08:09
в функцию можно что-то замувить без std::move(obj) в клиентском коде?

Constantine
01.06.2017
13:08:23
по-нормальному нет
reinterpret_cast, думаю, сработает
ах да
временный объект всегда перемещается

Constantine
01.06.2017
13:09:38
foo(string("hello")) будет конструктор string(const char*) и потом string(string&&) перемещение
если void foo(string s)
преобразование string& в string&& компилятором выполнено не будет
т.е.
void foo(string &&s);
//client
string s;
foo(s); //CE

Azoyan
01.06.2017
13:11:49
ошибка компиляции будет

Constantine
01.06.2017
13:11:59
CE это как раз compilation error

Azoyan
01.06.2017
13:12:07
я тебя понял
но не хотелось бы писать std::move(s) ради этого

Google

Constantine
01.06.2017
13:12:37
если хочешь понять механику перемещения, поработай с std::unique_ptr
собственно это потребитель номер 1
и характерный пример MoveConstructible но не CopyConstructible класса

Azoyan
01.06.2017
13:13:32
это я понимаю
но мне нужно реально мувить

Constantine
01.06.2017
13:13:45
?
хочешь РАЗРУШАТЬ?

Azoyan
01.06.2017
13:14:02
в смысле, я знаю что у unique_ptr запрещено копирование
ДА!

Antony
01.06.2017
13:14:12

Admin
ERROR: S client not available

Constantine
01.06.2017
13:14:23
ну делай swap с временным объектом

Azoyan
01.06.2017
13:14:32
оверхед

Constantine
01.06.2017
13:14:33
лучший способ разрушения
да то же самое
swap это три мува

Antony
01.06.2017
13:15:47

Александр
01.06.2017
13:16:12

reagentoo
01.06.2017
13:16:14
кстати, у Qt в семантике перемещения - свапится, у std:: источник обнуляется. фишка такая)

Александр
01.06.2017
13:16:49
свапится у всех, просто у некоторых чистится источник потом

Google

Constantine
01.06.2017
13:17:10
?
в конструкторе свопы писать?

Alexander
01.06.2017
13:17:29

reagentoo
01.06.2017
13:17:37

Antony
01.06.2017
13:18:42

Constantine
01.06.2017
13:19:35
оО а где здесь временный объект

Александр
01.06.2017
13:19:54
тоже не понял

Antony
01.06.2017
13:20:12

Александр
01.06.2017
13:20:23
а, ну да
логично, спасибо

Alexander
01.06.2017
13:21:04
Так, кто мне объяснит пропозал про токенизатор

Azoyan
01.06.2017
13:21:16
@antoshkka http://cpp.sh/4pkwz

Constantine
01.06.2017
13:21:31
вообще я не очень понимаю, как положено здесь по стандарту

Alexander
01.06.2017
13:21:32
Что там на stdcpp.ru такого нового в предложении

Constantine
01.06.2017
13:21:44
потому что VS разрешает
void f(std::string &x){}
void g(){ f(std::string("hello")); }
но дает варнинг на макслевеле
т.е. разрешено неявное преобразование string&& в string&
без промежуточных
f("hello"); //CE

Antony
01.06.2017
13:23:45

Alexander
01.06.2017
13:26:30
А range версию добавить если надо - ок, добавлю. Если её нет