"const auto" має якесь значення?


83

Я думаю, що питання досить чітке. Чи буде autoключове слово автоматично виявляти const-ness, або завжди повертати тип, який не є const, навіть якщо є наприклад. дві версії функції (одна, яка повертається, constа інша - ні).

Тільки для запису, я використовую const auto end = some_container.end()перед моїми циклами for-for, але я не знаю, чи це потрібно, або навіть відрізняється від звичайного auto.

Відповіді:


32

Можливо, ви плутаєте const_iteratorі const iterator. Перший перебирає елементи const, другий взагалі не може перебирати, оскільки ви не можете використовувати operatorsна ньому ++ та -.

Зверніть увагу, що ви дуже рідко повторюєте container.end(). Зазвичай ви будете використовувати:

const auto end = container.end();
for (auto i = container.begin(); i != end; ++i) { ... }

12
cbeginі cendповернути a const_iteratorза значенням. const autoяк і раніше має своє призначення і не є зайвим.
Далле

2
Тож const autoчи корисно в цьому загальному випадку?
rubenvb

@dalle: Я видалив свій абзац, перш ніж ти прокоментував, зрозумівши, що сказав просто безглузді речі :)
Бенуа

2
Хтось писав занадто багато sql. :)
Andres Jaan Tack

3
auto модифікується const як &, його можна використовувати в foreach, наприклад: en.cppreference.com/w/cpp/language/auto
Janosimas

97
const auto x = expr;

відрізняється від

auto x = expr;

як

const X x = expr;

відрізняється від

X x = expr;

Тож використовуйте const autoі const auto&багато, точно так само, як якщо б у вас цього не було auto.

На роздільну здатність перевантаження тип типу повернення не впливає: constабо відсутність constзначення lvalue xне впливає на те, які функції викликаються expr.


17
Ні. Якщо ви не збираєтеся (або передбачаєте) змінювати змінну, її слід оголосити const.
Пол Дж. Лукас,

7

Вважайте, що у вас є два шаблони:

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кваліфікувач сили .


3

Компілятор визначає тип для автоматичного кваліфікатора. Якщо виведений тип some_type, const autoбуде перетворено на const some_type. Однак хороший компілятор вивчить весь обсяг autoзмінної та виявить, якщо значення її де-небудь змінюється. Якщо ні, то сам компілятор виведе такий тип: auto-> const some_type. Я спробував це у Visual Studio Express 2012, і машинний код в обох випадках однаковий, я не впевнений, що кожен компілятор буде це робити. Але це хороша практика використовувати const autoз трьох причин:

  • Запобігання помилкам кодування. Ви передбачали, щоб ця змінна не змінювалась, але якось десь у її обсязі вона змінюється.
  • Покращена читабельність коду.
  • Ви допомагаєте компілятор , якщо з якоїсь - то причини він не виводить constза auto.

Компілятор не виводить const, якщо це можливо ... Він додасть const, лише якщо вираз, який він виводить за типом, вже є const сам по собі. Якщо компілятор просто додасть const заради того, щоб це було можливо, семантика програми може бути порушена, наприклад, const проти функцій-членів, які не є const, що викликаються залежно від того, може конкретний компілятор вивести const чи ні. Тому я думаю, що ваша остання думка неправильна.
rubenvb

@rubenvb Стандарти C ++ дозволяють компіляторам реорганізовувати код в залежності від того, як це їм підходить, залежно від бажаної оптимізації. Це абсолютно законно компілятор виводити constдля , auto якщо він не змінює функціональні можливості програми в будь-якому випадку . Сюди також входять перевірки, чи доступні функції const та non-const. Компілятор зробить це правильно.
BJovke
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.