std::move(a);
}
Тут std::move не несёт никакой пользы?
Тут из-за std::move у b будет вызван T::operator=(T const&&). На практике такие операторы никто не реализует и ближайшим выбором из того, что есть, будет, наверное, T::operator=(T const&)
Предположим, что b - std::string. Что будет?
Произойдёт копирование
Спасибо. Понял
Тут a - const, оно даже не скомпилируется
А можете ещё на это https://t.me/supapro/973620 ответить? Мне не даёт покоя
Я был неправ, оно скомпилируется. https://godbolt.org/z/944nbd3ah Но как ребята сказал, оно будет копировать, а не перемещать. Константу перемещать нельзя. На практике для move есть два интуитивных правила 0) видишь const - перемещать бессмысленно 1) видишь выражение в return - перемещать бессмысленно. Более нечего сказать.
С последним нужно быть аккуратнее, иногда это, как бы не было непривычно, имеет смысл
Видел тоже в одном из докладов, Eric Niebler кажется, делал мув в ретурне. Там что-то было очень сложное, что компилятор не понимал что надо переместить
Это Может в старых компилятора х
Я же оставил ссылку, автор в конце приходит к такому примеру: struct MyBrandNewFoo : Foo {}; Foo create() { MyBrandNewFoo newFoo; // interesting stuff return newFoo; } Здесь не всегда происходит перемещение — зависит и от компилятора, и от стандарта
Ещё, например, может быть случай с мувом захвата лямбды. В данном случае компилятор это сам не сделает
Доклад был новый. Про executors
Это и так ясно что зависит, в старых rvo вообще нет... Ладно, спасибо это полезно
Этот случай, кстати, по-моему не от компилятора/стандарта зависит, а от того, что тип возвращаемого значения и тип в сигнатуре не совпадают
Ну да, тут же срезку надо делать, какие ещё rvo?
Можно пример кодом?
Так выше же был дан
Не понял формулировку про лямбду
А, да, этого не было
auto f = [var = std::move(calcSmth())] {} ?
https://godbolt.org/z/jYbPo6M7o
Обсуждают сегодня