Когда вы не делаете этой строчкой только лишь возврат из функции Например, если тип возвращаемого объекта не совпадает с возвращаемым типом функции и требуется неявный вызов конструктора: std::optional<T> foo() { T ret; // ... return ret; } Здесь return ret означает не то, что написано, а return { ret }, что совсем уже другой случай. Здесь даже гарантированное RVO работает, но делает совсем не то, что нужно. Чтобы ни у кого не вызывать лишних вопросов, напишите явно: return { std::move(ret) }; Ещё один пример – когда жизнь объекта не заканчивается вместе с функцией, например, в случае глобального объекта или поля компилятор по понятным причинам не догадается вызвать мув
class super_class { public: std::string consume_name() { return std::move(name_); } private: std::string name_; };
return std::move(...)???
да, стринга мувится из внутреннего поля класса во внешний мир
А что может идти не так, если я свой класс же возвращаю из функции, которая должна его возвращать, а у меня деструктор класса вызывается?
Я думаю, что вам стоит привести код в качестве примера
А в каком примере это должно работать? Я вот написал простейший и не алё
Обсуждают сегодня