Думаю, вопрос достаточно ясен. Будет ли auto
ключевое слово автоматически определять константу или всегда возвращать неконстантный тип, даже если есть, например. две версии функции (одна возвращает, const
а другая - нет).
Для протокола: я использую const auto end = some_container.end()
перед циклами for, но не знаю, необходимо ли это или даже отличается от обычного auto
.
cbegin
иcend
вернутьconst_iterator
по значению.const auto
по-прежнему имеет свое предназначение и не является избыточным.const auto
что полезно в этом общем случае?const auto x = expr;
отличается от
auto x = expr;
в виде
const X x = expr;
отличается от
Так что используйте
const auto
иconst auto&
много, как если бы у вас не былоauto
.На разрешение перегрузки не влияет тип возвращаемого значения:
const
или отсутствиеconst
в lvaluex
не влияет на то, какие функции вызываютсяexpr
.источник
const
.Предположим, у вас есть два шаблона:
template<class U> void f1( U& u ); // 1 template<class U> void f2( const U& u ); // 2
auto
выведет тип и переменная будет иметь тот же тип, что и параметрu
(как в// 1
случае),const auto
сделает переменную того же типа, что и параметрu
в// 2
случае. Такconst auto
что просто форсируйтеconst
квалификатор.источник
Компилятор определяет тип автоматического квалификатора. Если выведенная тип
some_type
,const auto
будет преобразованconst some_type
. Однако хороший компилятор изучит всю областьauto
переменной и найдет, изменилось ли ее значение где-нибудь. Если нет, то компилятор сам выведет такой тип:auto
->const some_type
. Я пробовал это в Visual Studio Express 2012, и производимый машинный код одинаков в обоих случаях, я не уверен, что каждый компилятор будет делать это. Но это хорошая практика поconst auto
трем причинам:const
дляauto
.источник
const
для ,auto
если он не изменяет функциональные возможности программы в любом случае . Это также включает проверки, доступны ли функции-члены const и неконстантные. Компилятор все сделает правильно.