Cppcheck — статический анализатор C и C++. В коде C++ я иногда вижу флажок returnByReference
, предупреждающий, что
Функция «foo()» должна возвращать член «bar» по константной ссылке.
Почему я должен возвращать членов по константной ссылке? Почему члены отличаются от локальных переменных? Каковы плюсы и минусы такого изменения?
@Eljay Не могли бы вы преобразовать свой комментарий в ответ? Предоставление ссылки на ваш источник будет хорошим ответом!
Почему я должен возвращать членов по константной ссылке?
Из документации Cppcheck 2.14.0:
returnByReference: предупреждает, когда большой член класса возвращается по значению из функции получения.
Плюсы: отсутствие передачи большого объекта по значению. Копирование большого объекта в память может оказаться относительно дорогостоящим. В некоторых ситуациях возврат большого объекта уместен, а в других ситуациях это может быть возможностью оптимизации, которую следует рассмотреть, возвращая константную ссылку.
Минусы: тесная связь с деталями внутренней реализации. Это может быть проблемой, если вызывающая сторона метода получения не ожидает, что константная ссылка может относиться к изменяющемуся объекту, в то время как эта вызывающая сторона удерживает константную ссылку на переменную-член. Или если удерживаемая константная ссылка может стать висячей ссылкой объекта-владельца.
Из комментария Вольстада:
Почему члены отличаются от локальных переменных?
Срок действия локальных переменных заканчивается, когда метод возвращает значение (поэтому ссылка на них становится висячей), в отличие от членов, которые живут до тех пор, пока живет экземпляр класса.
Возможно, вам следует объяснить, почему «не передавать большой объект по значению» — это хорошо. Наверное, новичкам это не очевидно.
«Почему члены отличаются от локальных переменных?» - срок жизни локальных переменных заканчивается, когда метод возвращает значение (поэтому ссылка на них становится висячей), в отличие от членов, которые живут до тех пор, пока живет экземпляр класса.