имеет ли "const auto" какое-либо значение?
Я думаю, что вопрос достаточно ясен. Будет ли auto
ключевое слово auto-detect const-ness, или всегда возвращает неконстантный тип, даже если есть, например. две версии функции (та, которая возвращает const
и другой, который этого не делает).
просто для протокола, я использую const auto end = some_container.end()
перед моими for-loops, но я не знаю, если это необходимо или даже отличается от нормального auto
.
4 ответа:
может быть, вы путаете
const_iterator
иconst iterator
. Первый перебирает элементы const, второй не может перебирать вообще, потому что вы не можете использоватьoperators
++ и -- на нем.обратите внимание, что вы очень редко повторяю с
container.end()
. Обычно вы будете использовать:const auto end = container.end(); for (auto i = container.begin(); i != end; ++i) { ... }
const auto x = expr;
отличается от
auto x = expr;
как
const X x = expr;
отличается от
X x = expr;
так что используйте
const auto
иconst auto&
много, так же, как вы бы, если бы у вас не былоauto
.разрешение перегрузки не зависит от типа возврата:
const
или нетconst
на lvaluex
не влияет на то, какие функции вызываются вexpr
.
считайте, у вас есть два шаблона:
template<class U> void f1( U& u ); // 1 template<class U> void f2( const U& u ); // 2
auto
выведет тип и переменная будет иметь тот же тип, что и параметрu
(как и// 1
case),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
.