имеет ли `const auto` какое-либо значение? - PullRequest
70 голосов
/ 21 февраля 2011

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

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

Ответы [ 4 ]

84 голосов
/ 22 февраля 2011
const auto x = expr;

отличается от

auto x = expr;

в

const X x = expr;

отличается от

X x = expr;

Так что используйте const auto и const auto& как можно чаще, если бы у вас не было auto.

Разрешение перегрузки не зависит от типа возвращаемого значения: const или нет const для lvalue x не влияет на то, какие функции вызываются в expr.

26 голосов
/ 21 февраля 2011

Может быть, вы путаете const_iterator и const iterator.Первый итерирует по элементам const, второй не может итерировать вообще, потому что вы не можете использовать operators ++ и - на нем.

Обратите внимание, что вы очень редко выполняете итерации с container.end().Обычно вы будете использовать:

const auto end = container.end();
for (auto i = container.begin(); i != end; ++i) { ... }
7 голосов
/ 21 февраля 2011

Предположим, у вас есть два шаблона:

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 квалификатор.

2 голосов
/ 30 декабря 2016

Компилятор выводит тип для автоматического квалификатора. Если выведенный тип - some_type, const auto будет преобразован в const some_type. Тем не менее, хороший компилятор проверит всю область действия переменной auto и обнаружит, изменяется ли ее значение где-либо. Если нет, сам компилятор выведет тип следующим образом: auto -> const some_type. Я пробовал это в Visual Studio Express 2012, и машинный код был одинаковым в обоих случаях, я не уверен, что каждый компилятор сделает это. Но рекомендуется использовать const auto по трем причинам:

  • Предотвращение ошибок кодирования. Вы намеревались, чтобы эта переменная не менялась, но каким-то образом где-то в своей области видимости она изменилась.
  • Улучшена читаемость кода.
  • Вы помогаете компилятору, если по какой-то причине он не выводит const для auto.
...