Подтвердить что ты не робот

Как использовать auto с const и & в C++?

У меня есть метод, который возвращает const A &.

Если я хочу использовать авто, как правильно это сделать. Это нормально?

const auto &items = someObject.someMethod();

Я вижу, что некоторые люди делают это:

auto &items = someObject.someMethod();

Я не уверен, какой использовать, и какие различия на самом деле...

Редактировать:

В этом случае эти два эквивалента?

auto items = someObject.someMethod();
auto &items = someObject.someMethod();
4b9b3361

Ответ 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 && должен означать "поймать всех", возможно, принять объект "Возврат по значению"