имеет ли "const auto" какое-либо значение?


Я думаю, что вопрос достаточно ясен. Будет ли auto ключевое слово auto-detect const-ness, или всегда возвращает неконстантный тип, даже если есть, например. две версии функции (та, которая возвращает const и другой, который этого не делает).

просто для протокола, я использую const auto end = some_container.end() перед моими for-loops, но я не знаю, если это необходимо или даже отличается от нормального auto.

4 62

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 на lvalue x не влияет на то, какие функции вызываются в 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.