@ProCxx

Страница 927 из 2477
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
Александр
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
тогда почему он move называется)
он дергает семантику переноса

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
std::move ничего не перемещает. std::forward ничего не передает.
Страуструп тоже возмущается по этому поводу

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
ага. при передаче по обычном ссылке так тоже можно сделать, но это будет неприлично
Будет ещё проблема - временный объект по обычной ссылке не передашь: foo("Hello") не соберётся если void foo(std::string&)

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

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

Google
Constantine
01.06.2017
13:17:10
?

в конструкторе свопы писать?

reagentoo
01.06.2017
13:17:37
Antony
01.06.2017
13:18:42
кстати, всегда было интересно, с чем это связано
Это связано с безопасностью. Если разрешать временные объекты передавать по обычной ссылке, тогда будет вот так: long l = 1; foo(int& i) { ++i; } ... foo(l); assert(l == 2); // oops, l ==1

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

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

Antony
01.06.2017
13:20:12
оО а где здесь временный объект
Из long создастя временный int

Александр
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
Так, есть же токенизатор в бусте уже
Он больше в стиле Ranges чем в стиле текущих <algorithm>. Его надо будет протащить, но прям сейчас это не получится

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

Страница 927 из 2477