Использование auto

Минусы auto

  • Основная проблема auto — это вывод типа. Программист может ошибиться — из-за сложной конструкции auto выведет не тот тип, который он предполагал, но это уже проблема компетенций конкретного разработчика. Ошибки с этим могут быть также и в самых простых ситуациях:

auto Number = 5; // int
auto Number = 5.0; // double
auto Number = 5.0f; // float;

int Number = 5.0; // int
float Number = 5.0; // float
double Number = 5.0f; // double
  • Тип неясен, когда читаете код на GitHub или в редакторе, который не поддерживает интеллектуальные подсказки

Плюсы auto

  • Имена типов C++ могут быть длинными и громоздкими, особенно, когда они связаны с шаблонами, итераторами или пространствами имен. Auto повышает читаемость кода, уменьшает его количество:

TMap<MyOwnType, TArray<MyOtherType>> Object1 = ...

// или

auto Object1 = ...
  • Auto предотвращает переписывание кода (например, если поменялся тип возвращаемого значения у какой-нибудь функции).

// если тип возращаемого значения у данной функции поменяется
TMap<MyOwnType, TArray<MyOtherType>> getMap();

// данные строчки таже придется переписать
TMap<MyOwnType, TArray<MyOtherType>> Map1 = getMap();
TMap<MyOwnType, TArray<MyOtherType>> Map2 = getMap();

// при использовании auto этого делать не придется
auto Map1 = getMap();
auto Map2 = getMap();
  • Все современные IDE поддерживают интеллектуальные подсказки (врядли кто-то пишет код в notepad). Наводите — узнаёте тип.

Auto в Unreal Engine

Возникло обсуждение по поводу корректности использования auto в контексте данной информации на странице Coding Standard:

You shouldn't use auto in C++ code, although a few exceptions are listed below. Always be explicit about the type you're initializing.

  • Данная страница — это набор рекомендаций по написанию кода. Документом это к сожалению назвать нельзя. Для сравнения рекомендую посмотреть как сделан такой документ у google.

  • Вопросы могут возникнуть если вы делаете pull-request в код движка. В процессе ревью вас могут попросить заменить auto на полное имя типа. Но поиск по коду движка выдает 16529 вхождений auto. Вывод очевиден — разработчики движка сами не особо следуют своему правилу:

  • На проектах я использую auto в местах, где нет никаких сложных вычислений типа. Он везде очевиден. Поэтому использование auto более чем уместно.

  • Большинство имен переменных содержит информацию о типе

// очевидно, что это FVector
const auto PlayerLocation = ...

// очевидно, что это AActor*
const auto DamagedActor = HitResult.GetActor();
  • В некоторых конструкциях, например, Cast, тип является параметром шаблона. В данном случае тип очевиден также:

// очевидно, что это ASTUGameModeBase*
const auto GameMode = Cast<ASTUGameModeBase>(GetWorld()->GetAuthGameMode());

// очевидно, что это USTUWeaponComponent*
const auto WeaponComponent = STUUtils::GetSTUPlayerComponent<USTUWeaponComponent>(Pawn);

Резюме

  • Не вижу причин не использовать auto.

  • Делать надо это аккуратно. Если не уверены по поводу типа — пишите явно.

  • Не нравится auto — используете полное имя типа. Это тоже отлично (=

  • Дополнительно про использование auto можно почитать в документации google.

  • Дополнительная информация имеется в статье Герба Саттера "Almost Always Auto"

Last updated