Anatoly
а я и не говорю, что не работает
Anatoly
я говорю, что может быть все что угодно
Micktu 😬
угу, все понятно, спасибо
Micktu 😬
еще общий вопрос - если я возвращаю контейнер из функции и немедленно присваиваю - std::vector<> myFunc(); ... std::vector<> v = muFunc(); - следуюет ли ожидать, что это будет мув или не расчитывать на это и указывать мув эксплиситли?
Andrei
Во-первых не будет ничего.
Andrei
Потому что RVO
Andrei
Во-вторых так как ты написал — это копи, а не мув.
Micktu 😬
ожидать, что рво позаботиится об этом?
Micktu 😬
или не надеяться, если это критично?
Andrei
андефайнд не значит что не работает
В плюсах undefined behavior — термин имеющий специальное значение.
Micktu 😬
как это работает для меня?
Andrei
Это значит, что НЕ РАБОТАЕТ
Andrei
если тебе нужен мув
Andrei
напиши мув
Andrei
если тебе нужна копия — напиши копию.
Deleted Account
std::vector<> v = std::move(muFunc());
Micktu 😬
то есть, до тех пор пока у меня синтаксис копирования, я могу расчитывать только на копирование, и все остальное зависит от меня?
Andrei
Да.
Micktu 😬
принято
Micktu 😬
спасибо, сенсей
Anatoly
если у тебя std::vector<> myFunc();
Anatoly
то при std::vector<> v = myFunc(); будет вызван перемещающий конструктор
Anatoly
vector(vector &&);
Micktu 😬
вот это я и спрашивал
Micktu 😬
он же генерируется дефолтом, как и остальные, верно?
Anatoly
все будет в порядке
Andrei
он же генерируется дефолтом, как и остальные, верно?
Нет, они определены просто для стандартных контейнеров.
Anatoly
он генерируется дефолтом, если мебмеры имеют мув консруктор
Andrei
Генерируются имплиситли они только для POD-ов
Micktu 😬
это был волпрос вне контекста контейнеров уже
Andrei
Или для структур ггде у всех полей move есть
Micktu 😬
справедливо
Micktu 😬
и снова спасибо
Micktu 😬
вот почему я хочу быть в чате с людьми, которые понимают, как это работает
Nikita
вот почему я хочу быть в чате с людьми, которые понимают, как это работает
эти же люди и в #supapro сидят, когда время появляется и желание помочь
Micktu 😬
в супапро помимо этого наверняка много вопросов которые еще ниже
Micktu 😬
кстати зайду я туда может сам смогу чем-то помочь чувакам
Micktu 😬
ну вот такого типа
Micktu 😬
Можете подсказать какие библиотеки важны в с++ и какие стоит изучить в первую очередь
Micktu 😬
вот поэтому лучше тут чем не тут.
Micktu 😬
у меня хотя бы вопросы конкретные...
Anatoly
Можете подсказать какие библиотеки важны в с++ и какие стоит изучить в первую очередь
некоррекный вопрос, используй (и соответственно изучи) те, которые используешь для решения задачи
Micktu 😬
я привел это как пример тупого вопроса
Anatoly
сорри, не понял
Micktu 😬
не за что
Micktu 😬
кстати мнения немножко разделились
Micktu 😬
вот Андрей считает что мув надо указывать эксплсит если это важно. (но рво и так позаботится) ты считаешь, что можно не паритсья, и точно позаботится
Micktu 😬
что так или иначе произойдет или рво, или мув
Deleted Account
что так или иначе произойдет или рво, или мув
на рво не надейся, сам не плошай
Anatoly
return value optimization - это оптимизация, которую компилятор МОЖЕТ сделать
Micktu 😬
да, но вот вопрос
Micktu 😬
насколько часто он делает на практике?
babysitter
std::vector<> v = std::move(muFunc());
Не нужно так писать
Deleted Account
Не нужно так писать
откуда ты знаеш
Micktu 😬
инлайн - тоже операция, которую компилятор МОЖЕТ сделать, но это же не повод форсинлайнить все вручную
Anatoly
std::move явно здесь не нужен
Micktu 😬
Deleted Account
я бы вообще не парился и делал всё в на куче
Anatoly
поскольку myFunc возвращает временный объект, который подходит под vector&&
Artem
http://stackoverflow.com/a/17473869
Micktu 😬
окей, это тот самый ответ который я хотел слышать
Deleted Account
и заворачивал в уник поинторы
Deleted Account
и бед не знал бы
Surreal
а как нужно?
Вы таким образом явно убиваете возможность rvo, которое быстрее move.
Micktu 😬
компилятор не дедуцирует, что мув нафиг не нужен и не поступает по-своему?
Micktu 😬
я вот почему-то думаю, что должен
Andrei
При этом надо делать
Anatoly
само собой
Micktu 😬
что вообще из себя представляет вызов std::move()?
Micktu 😬
это враппер или абстракция компилятора?
Surreal
я вот почему-то думаю, что должен
Эээ, вы ему явно говорите мувать, а он такой, не, я лучше тут копи элизион запилю.
Andrei
что вообще из себя представляет вызов std::move()?
ничего, это просто каст к T&&
Micktu 😬
понял
Anatoly
это заставляет компилятор перенести состояние одного объекта в другой
Anatoly
после std::move(object) object уже не будет владеть состоянием, которым владел до мува