Привет, предположим есть код: Код (Text): std::vector<int> Fun() { std::vector<int> res; // some initializations // return res; return std::move(res); } std::vector<int> res = Fun(); Вот я даже в дебаге не заметил разницы между return res и return std::move(res), по идее же должно быть одно копирование без std::move, или я чего-то туплю? Т.е. это оптимизация компилятора, или я в стандарте чето не так понимаю\помню?
С другой стороны я не понимаю почему здесь должно быть различие. return std::move(res); return std::vector<int> res; Разве тут есть что-то, что должно приводить к различию?
Booster Есть. Со вторым случаем все понятно - вызывается конструктор копирования. Первый случай. Посмотрим на std::move: Код (Text): template<typename T> remove_reference<T>::type&& move(T&& a) { return a; } std::move превращает ссылку на объект в &&, что при return дает вызов не копирующего, а move-конструктора.
Да, но у вектора есть мув-конструктор, поэтому в темповый объект который будет возвращен, вектор будет мувнут, а не скопирован, а этот темповый, соответственно мувнут в результирующий, потому как он рвэлью, так вот я думаю, стоит ли по-хорошему писать мув перед возвратом везде, или это 100% не нужно.
А да, темповый тоже должен получить rvalue reference и вся цепочка объектов пойдёт с move конструкторами, только на количество временных объектов это вряд ли повлияет. Если действительно идут одни вызовы move конструкторов, тогда nrvo тут не причём, видимо компилятор шибко умный.