У `const auto` есть смысл?
Я думаю, что этот вопрос достаточно ясен. Будет ли константа auto
автоматически определять константу или всегда возвращать неконстантный тип, даже если есть, например. две версии функции (одна, которая возвращает const
, а другая - нет).
Только для записи я использую const auto end = some_container.end()
перед моими циклами, но я не знаю, требуется ли это или даже отличается от обычного auto
.
Ответы
Ответ 1
Возможно, вы путаете const_iterator
и const iterator
. Первый из них выполняет итерацию по элементам const, второй - не может быть продолжен, потому что вы не можете использовать operators
++ и - на нем.
Обратите внимание, что вы очень редко повторяетесь с container.end()
. Обычно вы будете использовать:
const auto end = container.end();
for (auto i = container.begin(); i != end; ++i) { ... }
Ответ 2
const auto x = expr;
отличается от
auto x = expr;
а
const X x = expr;
отличается от
X x = expr;
Поэтому используйте const auto
и const auto&
много, как и вы, если бы у вас не было auto
.
Разрешение возврата не зависит от типа возврата: const
или no const
на lvalue x
не влияет на то, какие функции вызывают в expr
.
Ответ 3
У вас есть два шаблона:
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
.
Ответ 4
Компилятор выводит тип автоматического классификатора. Если выводимый тип some_type
, const auto
будет преобразован в const some_type
. Однако хороший компилятор рассмотрит всю область действия переменной auto
и найдет, изменится ли ее значение в любом месте. Если нет, сам компилятор выведет такой тип: auto
→ const some_type
. Я пробовал это в Visual Studio Express 2012, а машинный код в обоих случаях одинаковый, я не уверен, что каждый компилятор сделает это.
Но рекомендуется использовать const auto
по трем причинам:
- Предотвращение ошибок кодирования. Вы предназначались для этой переменной не изменять, а как-то где-то в ней область изменена.
- Улучшена читаемость кода.
- Вы помогаете компилятору, если по какой-то причине он не выводит
const
для auto
.