
Nik
20.06.2018
17:26:39
А еще лучше Billy O’Neal

Matwey
20.06.2018
17:55:21

Побитый
20.06.2018
18:40:38
Имеем:
https://pastebin.com/469tzae0
Будет ли здесь заюзано copy elision\NRVO\move?
Стандарт С++11.
Если в С++14 что то изменилось по этому поводу, то тоже интересно.

Google

Побитый
20.06.2018
18:41:46
Если шо, wstr.str() имеет возвращаемый тип wstring.

Kitsu
20.06.2018
18:51:00
почти уверен, что будет
decltype(str()) же внутренний тип, а не аллоцируется заново

Побитый
20.06.2018
18:57:06

Igor
20.06.2018
19:24:03

Vhäldemar
20.06.2018
19:32:34
https://ideone.com/WavYix
WHYYYYYYYYYYYYYY

Assasin
20.06.2018
19:33:48

Igor
20.06.2018
19:34:02

Побитый
20.06.2018
19:40:36

Vhäldemar
20.06.2018
19:41:17

Igor
20.06.2018
19:41:40

Александр
20.06.2018
19:42:21

Google

Побитый
20.06.2018
19:42:43

Igor
20.06.2018
19:42:57

Александр
20.06.2018
19:42:57
А move?
Без явного указания не будет

Побитый
20.06.2018
19:44:10

Vhäldemar
20.06.2018
19:44:29

Nik
20.06.2018
19:44:52

Igor
20.06.2018
19:45:09

Александр
20.06.2018
19:45:27

Побитый
20.06.2018
19:49:14
Конкретно по ссылке выше, если сделать 11 стандарт, будет ошибка компиляции

Alexey
20.06.2018
19:49:40
в 11/14 он может быть, но не обязателен. как я понимаю

Александр
20.06.2018
19:49:44

Побитый
20.06.2018
19:50:56

Александр
20.06.2018
19:52:57


Побитый
20.06.2018
19:55:19
Сомнительно
Взято отсюда: http://en.cppreference.com/w/cpp/language/return
If expression is an lvalue expression and the conditions for copy elision are met, or would be met, except that expression names a function parameter, then overload resolution to select the constructor to use for initialization of the returned value is performed twice: first as if expression were an rvalue expression (thus it may select the move constructor or a copy constructor taking reference to const), and if no suitable conversion is available, overload resolution is performed the second time, with lvalue expression (so it may select the copy constructor taking a reference to non-const).
The above rule applies even if the function return type is different from the type of expression (copy elision requires same type)
То есть как я понял, при первой попытке перегрузки он может применить move конструктор
У Майерса тоже про это было

Igor
20.06.2018
20:14:38

Google

Крис
20.06.2018
20:22:49
17 стандарт устраняет неоднозначность относительно copy elision?

Дмитрий
20.06.2018
20:28:34

Diver
20.06.2018
20:57:16
Хелло, есть кто проконсультирует по поводу arm-linux-gnueabihf-g++?

/dev
20.06.2018
21:02:02

Igor
20.06.2018
21:16:59
Да. Теперь обязательно везде.
Нет. Guaranteed copy elision в C++17 применимо только к подмножеству случаев когда разрешается copy elision. Например, с NRVO ничего не поменялось.

Mikhail Voronov
20.06.2018
21:52:36

Igor
20.06.2018
22:25:28

Побитый
20.06.2018
22:43:41

Igor
20.06.2018
23:00:06

Antony
20.06.2018
23:39:07

Diver
20.06.2018
23:47:12
народ, кому не лень сейчас поставить arm-linux-gnueabihf-g++ и проверить одну багу? Сделаем хорошо комьюнити

Antony
20.06.2018
23:48:23

Alexey
20.06.2018
23:48:44

Antony
20.06.2018
23:49:35
Продумываю этот кейс

Alexey
20.06.2018
23:51:29
А первый пункт, кажется ни у кого ничего не ломает гарантированно. Ну и избавляет от дурного влияние std::move на компилятор. Если хотя бы он войдет - будет уже неплохо. IMHO.
А то по коду периодически ловлю мувы где они вредят.

Igor
21.06.2018
05:43:56

yuri
21.06.2018
05:46:18
и про std::forward не забывайте.

Google

Vhäldemar
21.06.2018
06:38:22

Побитый
21.06.2018
06:59:34

Surreal
21.06.2018
07:18:51

Admin
ERROR: S client not available

yuri
21.06.2018
07:19:43

Surreal
21.06.2018
07:19:55
шта?

Bogdan
21.06.2018
07:20:42
когда вы имеете тип Т, например так
template <typename T>
void f(T&& t);
вы не можете быть уверены, T это rvalue или lvalue, тут вместо std::move нужно всегда использовать std::forward<T>

yuri
21.06.2018
07:24:16
но это же и есть perfect forwarding.

Surreal
21.06.2018
07:27:35
http://thbecker.net/articles/rvalue_references/section_08.html
Не надо путать std::move, std::forward, X{}, T и T&&.

Побитый
21.06.2018
07:34:08

Bogdan
21.06.2018
07:34:18
да, я исправил
не сразу заметил)

yuri
21.06.2018
08:11:16
Чувствую, std::move vs std::forward в коде будет предметом тех еще холиворов.

Surreal
21.06.2018
08:13:43
При чем тут холивары? Это разные инструменты.

yuri
21.06.2018
08:15:01
После 15 лет в индустрии меня раздражает множество мелочей.

Surreal
21.06.2018
08:16:57
Для того и нужны специалисты, чтобы разбираться в мелочах.

yuri
21.06.2018
08:17:51
В частности, очень не люблю объявление нескольких переменных в одной строчке. Копипастишь, и раздражает потом вырезать лишние переменные. Так и здесь. Буду копипастить темплейты, а там вместо move надо будет forward. Неужели прошлый программист сразу не мог написать forward??

Anatoly
21.06.2018
08:27:04

Andrey
21.06.2018
08:28:03
Clang -Wpessimizing-move
https://godbolt.org/g/xkS6KE

Google

Spoonson
21.06.2018
08:31:49

Kirill
21.06.2018
08:32:14

Oleg
21.06.2018
08:32:31

Surreal
21.06.2018
08:32:32
Может в 3 случае сразу принимать foo&&?

yuri
21.06.2018
08:44:53
Кстати, раз тут второй день про copy elision обсуждение, есть ли красивые способы вот здесь сегфолт убрать? https://onlinegdb.com/S13BSkFb7

Andrey
21.06.2018
08:46:10
а почему в первых двух случаях не надо? Из-за NRVO?
Тут хорошо расписано: http://vmpstr.blogspot.com/2015/12/redundant-stdmove.html
Краткий ответ, да, если может быть применено nrvo — return statement аргументом которого является локальная переменная или параметр функции (возможно, окруженные скобками), то value category выражения автоматически меняется с lvalue на xvalue.

Ilia
21.06.2018
09:03:07
Ой, xvalue что ?
Ни то, ни сё, что угодно?

Assasin
21.06.2018
09:04:37
хм, интересноый варнинг выдает gcc 8.1 на код
auto f(auto &&s) {
return std::move(s);
}
[x86-64 gcc 8.1 #1] warning: use of 'auto' in parameter declaration only available with -fconcepts
Разве это доступно не с C++14? На gcc 7 такого нет

Andrey
21.06.2018
09:13:54

Maksym
21.06.2018
09:14:26
для параметров

Assasin
21.06.2018
09:15:06