имеет ли "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(как и// 1case),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.