поле?
Если этот метод помечен как &&, то ничего плохого
Скорее всего это плохо продуманный метод
Кажется, в таком случае нужен возврат значения, а не &&, иначе всё взорвётся на первом же временном объекте. Если честно, я особо и не вспомню, когда мне нужен был возврат rvalue reference из функции/метода, так что к такому коду я бы отнёсся с подозрением
Есть буффер аккумулирующий в себя данные через преобразователь и потом мне все эти обертки/преобразователи не нужны и нужно вынуть данные, но копировать дорого.
На счет взрыва, вроде ничего такого нет, после мута обьект все равно в валидном состоянии и спокойно удалится.
Как говорит Владимиров: если вы возвращаете r-value,то: 1. Вы пишете std::move 2. Вы пишете std::forward 3. Вы пишете declval 4. Вы пишете && аннотированный метод класса 5. Вы делаете что-то не так
Возвращайте из функции по значению, но делайте return std::move(...);. Здесь не будет копирования, как и риска, что ссылка провиснет
Я делаю так: data&& class::dt() &&; data&& get_data(class&& cz) { return class.dt(); }
Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!
Вот на счёт этого есть нюансы: https://en.cppreference.com/w/cpp/language/copy_elision
@d7d1cd, @Mouse_Grays, из && аннотированного класса как раз нельзя возвращать rvalue-ref: auto&& ref = Class{}.get_data(); Всё взорвалось, ошибки нет. Как раз наоборот, только из lvalue qualified метода есть смысл возвращать rvalue-ссылку
Спасибо, не подумал об этом)
Этот нюанс не относится к обсуждаемому вопросу, поскольку это один из тех редких примеров, где std::move как раз необходим для обеспечения корректности. NRVO не имеет смысла для полей или глобальных объектов
С одной стороны, я согласен с логикой, что для принимающей стороны возврат по значению удобнее, чем по &&. С другой стороны, мы теряем симметрию: вспоминаем 4 перегрузки и deducing this, где сохраняется ссылочность/constness
Почему нельзя? Вот тут Владимиров показывает, что можно. Или я чегой-то не так понял?
Проблема в том, что возврат своего же rvalue-ref аргумента по ссылке является ошибкой вне зависимости от того, метод это или свободная функция: // плохо auto&& foo(Bar&& bar) { return std::move(bar).baz; } В случае метода ничего принципиально не меняется: struct Bar { std::string baz; // плохо auto&& foo() && { return std::move(*this).baz; // или return std::move(baz); } } Мне кажется, что правильное определение выглядит вот так: struct Bar { std::string baz; // плохо auto&& foo() & { return std::move(*this).baz; } // потому что не имеет смысла auto&& foo() const & = delete; auto&& foo() const && = delete; // потому что опасно auto&& foo() && = delete; // или std::ranges::dangling foo() &&; };
На следующем слайде он говорит, что ссылка всегда провисает, и нужно стараться не возвращать правые ссылки Мне кажется, там есть какая-то путаница в лекции
Он на том слайде говорит "старайтесь не возвращать правые ссылки ни откуда, кроме && аннотированных методов".
Да, здесь все плохо, даже тупые тесты не проходит
Я считаю, что это ошибочное утверждение в докладе. Лучше открыть вторую ветку комментариев
Ну моих знаний недостаточно, чтобы аргументировать Владимирову, что он не прав )
держи, https://godbolt.org/z/K66d95d63, теперь у тебя есть всё что нужно))
Оставил комментарий под видео.
Там уже Ofee оставил)
Обсуждают сегодня