Возврат членов по константной ссылке (returnByReference Cppcheck)

Cppcheck — статический анализатор C и C++. В коде C++ я иногда вижу флажок returnByReference, предупреждающий, что

Функция «foo()» должна возвращать член «bar» по константной ссылке.

Почему я должен возвращать членов по константной ссылке? Почему члены отличаются от локальных переменных? Каковы плюсы и минусы такого изменения?

«Почему члены отличаются от локальных переменных?» - срок жизни локальных переменных заканчивается, когда метод возвращает значение (поэтому ссылка на них становится висячей), в отличие от членов, которые живут до тех пор, пока живет экземпляр класса.

wohlstad 30.06.2024 15:55

@Eljay Не могли бы вы преобразовать свой комментарий в ответ? Предоставление ссылки на ваш источник будет хорошим ответом!

OpenSourceOrDie 30.06.2024 16:01
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Почему я должен возвращать членов по константной ссылке?

Из документации Cppcheck 2.14.0:

returnByReference: предупреждает, когда большой член класса возвращается по значению из функции получения.

Плюсы: отсутствие передачи большого объекта по значению. Копирование большого объекта в память может оказаться относительно дорогостоящим. В некоторых ситуациях возврат большого объекта уместен, а в других ситуациях это может быть возможностью оптимизации, которую следует рассмотреть, возвращая константную ссылку.

Минусы: тесная связь с деталями внутренней реализации. Это может быть проблемой, если вызывающая сторона метода получения не ожидает, что константная ссылка может относиться к изменяющемуся объекту, в то время как эта вызывающая сторона удерживает константную ссылку на переменную-член. Или если удерживаемая константная ссылка может стать висячей ссылкой объекта-владельца.

Из комментария Вольстада:

Почему члены отличаются от локальных переменных?

Срок действия локальных переменных заканчивается, когда метод возвращает значение (поэтому ссылка на них становится висячей), в отличие от членов, которые живут до тех пор, пока живет экземпляр класса.

Возможно, вам следует объяснить, почему «не передавать большой объект по значению» — это хорошо. Наверное, новичкам это не очевидно.

Mark Ransom 30.06.2024 16:18

Другие вопросы по теме