Подтвердить что ты не робот

У `const auto` есть смысл?

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

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

4b9b3361

Ответ 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 и найдет, изменится ли ее значение в любом месте. Если нет, сам компилятор выведет такой тип: autoconst some_type. Я пробовал это в Visual Studio Express 2012, а машинный код в обоих случаях одинаковый, я не уверен, что каждый компилятор сделает это. Но рекомендуется использовать const auto по трем причинам:

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