Как использовать auto с const и & в C++?
У меня есть метод, который возвращает const A &.
Если я хочу использовать авто, как правильно это сделать. Это нормально?
const auto &items = someObject.someMethod();
Я вижу, что некоторые люди делают это:
auto &items = someObject.someMethod();
Я не уверен, какой использовать, и какие различия на самом деле...
Редактировать:
В этом случае эти два эквивалента?
auto items = someObject.someMethod();
auto &items = someObject.someMethod();
Ответы
Ответ 1
Несмотря на то, что в этом случае две формы эквивалентны, я бы выбрал первую форму в любом случае, так как она лучше сообщает, что ваш фрагмент кода не нуждается в изменении состояния объекта, возвращаемого someMethod()
.
Итак, я советую пойти на это:
const auto &items = someObject.someMethod();
Ответ 2
В вашем случае нет разницы. Тип, который auto
представляет, будет выведен на const A
в обоих случаях, поэтому тип items
будет const A&
.
Есть разница в том, что такое "самодокументированная семантика" кода. В const auto &
четко указано: "Я хочу ссылку на то, что возвращается, и я не буду изменять его". Просто auto &
говорит просто "Я хочу ссылку на то, что возвращается".
Ответ 3
Более явное объяснение обычно лучше, исключение - разделение проблем. Детали реализации не должны упоминаться на клиентской стороне интерфейса.
Если приемник не должен заботиться о том, как объект принимается, то идеальная пересылка - это путь.
auto && items = someObject.someMethod();
Разрешение const
выводиться в auto
и, например, привязка временного значения к auto &
будет основным запахом кода для меня.
-
auto const &
должен означать только для чтения
-
auto &
должен означать чтение-запись
-
auto &&
должен означать "поймать всех", возможно, принять объект "Возврат по значению"