@ProCxx

Страница 2148 из 2477
Nik
20.06.2018
17:26:39
А еще лучше Billy O’Neal

Matwey
20.06.2018
17:55:21
А еще лучше Billy O’Neal
Звучит как хорошее название для ирландского паба

Побитый
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()) же внутренний тип, а не аллоцируется заново

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
https://ideone.com/WavYix
и зачем это здесь?

Igor
20.06.2018
19:34:02
https://ideone.com/WavYix
Сегодня на уроке мы изучаем условный оператор.

Побитый
20.06.2018
19:40:36
WHYYYYYYYYYYYYYY
else аттачится к ближайшему if того же уровня

Vhäldemar
20.06.2018
19:41:17
Сегодня на уроке мы изучаем условный оператор.
грамматику глянуть не пробовали?

Igor
20.06.2018
19:41:40
Google
Побитый
20.06.2018
19:42:43
Igor
20.06.2018
19:42:57
Copy elision здесь не будет
Будет. https://godbolt.org/g/KoGXUd

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

Побитый
20.06.2018
19:44:10
Без явного указания не будет
А если добавить локальный объект result, присвоить ему wstr.str() и сделать return result, то будет nrvo\move?

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
Будет. https://godbolt.org/g/KoGXUd
действительно. не будет, если ссылку возвращать.

А если добавить локальный объект result, присвоить ему wstr.str() и сделать return result, то будет nrvo\move?
будет nrvo в таком случае, но не нужно, ибо copy elision (я ошибся выше)

Побитый
20.06.2018
19:49:14
будет nrvo в таком случае, но не нужно, ибо copy elision (я ошибся выше)
То, что в 17 стандарте будет copy elision, я и не сомневался. Вопрос был про c++11/14

Конкретно по ссылке выше, если сделать 11 стандарт, будет ошибка компиляции

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

Александр
20.06.2018
19:49:44
То, что в 17 стандарте будет copy elision, я и не сомневался. Вопрос был про c++11/14
а там никто не гарантирует. на моей памяти, в случае не срабатывания NRVO/RVO идёт копия (само не мувнется)

Побитый
20.06.2018
19:50:56
а там никто не гарантирует. на моей памяти, в случае не срабатывания NRVO/RVO идёт копия (само не мувнется)
Насколько я знаю, если nrvo не срабатывает, но формальные условия nrvo соблюдены, то компилятор трактует возвращаемое значение как rvalue.

Побитый
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
Для результата-структуры только не уверен, будет ли работать
64-битный констэкспр-хеш посчитай от структуры, тогда в шаблон влезет

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

Mikhail Voronov
20.06.2018
21:52:36
Написать Стефану?
Спасибо, я наверное все-таки в developer community сделаю тикет

Igor
20.06.2018
22:25:28
Ага, вроде только для prvalue (но саму категорию prvalue немного расширили)
Точнее ее не расширили, а поменяли смысл самой категории. Если раньше prvalue символизировал временный объект, то теперь это просто нечто из чего временный объект можно создать когда потребуется.

Побитый
20.06.2018
22:43:41
Igor
20.06.2018
23:00:06
Прочти моё сообщение про nrvo выше и скажи прав ли я, по твоему мнению?))
Да, если возвращается локальный объект и не параметр catch блока.

Antony
20.06.2018
23:39:07
Имеем: https://pastebin.com/469tzae0 Будет ли здесь заюзано copy elision\NRVO\move? Стандарт С++11. Если в С++14 что то изменилось по этому поводу, то тоже интересно.
Нет, не будет Стандартом на данный момент хапрещено делать copy elision Но мы работаем над этим https://stdcpp.ru/proposals/e6263404-2b60-49af-87c6-bd9bc1801257

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

Antony
20.06.2018
23:48:23
17 стандарт устраняет неоднозначность относительно copy elision?
Только для prvalue Другими словами, если переменная без имени присваивается в переменную с именем и только

Alexey
20.06.2018
23:48:44
Нет, не будет Стандартом на данный момент хапрещено делать copy elision Но мы работаем над этим https://stdcpp.ru/proposals/e6263404-2b60-49af-87c6-bd9bc1801257
4 пункт ломает существующий код! Я всё помню! ? код с замерами времени выполнения функций.

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

Igor
21.06.2018
05:43:56
А первый пункт, кажется ни у кого ничего не ломает гарантированно. Ну и избавляет от дурного влияние std::move на компилятор. Если хотя бы он войдет - будет уже неплохо. IMHO. А то по коду периодически ловлю мувы где они вредят.
А есть что годного почитать про вредные мувы? А то на встрече это упоминалось, но логики когда нужен return move(x) а когда сойдет просто return x я не уловил(

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

Google
Побитый
21.06.2018
06:59:34
А есть что годного почитать про вредные мувы? А то на встрече это упоминалось, но логики когда нужен return move(x) а когда сойдет просто return x я не уловил(
У Майерса есть про это в "Эффективный и современный с++" в русской версии у меня обсуждение начинается на 179 странице

Surreal
21.06.2018
07:18:51
и про std::forward не забывайте.
Есть кейсы, где он нужен, кроме Args&&...args -> std:forward<Args>(args)...?

Admin
ERROR: S client not available

yuri
21.06.2018
07:19:43
Есть кейсы, где он нужен, кроме Args&&...args -> std:forward<Args>(args)...?
Из пары видеороликов я так понял, его надо использовать вместо move.

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
А есть что годного почитать про вредные мувы? А то на встрече это упоминалось, но логики когда нужен return move(x) а когда сойдет просто return x я не уловил(
если тип переменной не отличается от типа возвращаемого значения: struct foo{}; foo f1() { foo f; return f; // не надо } foo f2(foo f) { return f; // не надо } foo f3(foo& f) { return std::move(f); // надо } если тип переменной отличается от типа возвращаемого значения, всегда надо move

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

Google
Kirill
21.06.2018
08:32:14
если тип переменной не отличается от типа возвращаемого значения: struct foo{}; foo f1() { foo f; return f; // не надо } foo f2(foo f) { return f; // не надо } foo f3(foo& f) { return std::move(f); // надо } если тип переменной отличается от типа возвращаемого значения, всегда надо move
есть 1 исключение если это юник птр например и ты из фабрики возвращаешь юник на интерфейс, но реально на наследника. типы разные, но для читаемости лучше кастить, а не мувать

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
Может в 3 случае сразу принимать foo&&?
нет, тогда нельзя будет передать lvalue. Universal reference - это к шаблонам относится, потому что там есть сворачивание ссылок

хм, интересноый варнинг выдает 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
Ой, xvalue что ? Ни то, ни сё, что угодно?
Грубо говоря, да. An xvalue is a glvalue that denotes an object or bit-field whose resources can be reused (usually because it is near the end of its lifetime).

Assasin
21.06.2018
09:15:06
если это функция, а не лямбда, то вроде не робит
даже с -pedantic робит: https://godbolt.org/g/B7QpEx

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