Есть несколько причин, почему я не люблю auto для общего пользования:
- Вы можете рефакторинг кода без его изменения. Да, это одна из тех вещей, которые часто упоминаются как преимущество использования авто. Просто измените тип возврата функции, и если весь код, который ее вызывает, использует auto, никаких дополнительных усилий не требуется! Вы нажимаете кнопку compile, он создает - 0 предупреждений, 0 ошибок - и вы просто продолжаете и проверяете свой код без необходимости разбираться с беспорядком просмотра и потенциальным изменением 80 мест, где используется функция.
Но подождите, это действительно хорошая идея? Что если тип имел значение в полдюжине этих вариантов использования, и теперь этот код ведет себя по-другому? Это также может неявно нарушать инкапсуляцию, изменяя не только входные значения, но и поведение самой частной реализации других классов, которые вызывают функцию.
1a. Я верю в понятие «самодокументируемый код». Причиной самодокументируемого кода является то, что комментарии имеют тенденцию устаревать, больше не отражая то, что делает код, в то время как сам код - если написан явным образом - не требует пояснений, всегда остается актуальным на его намерение, и не оставит вас в замешательстве с несвежими комментариями. Если типы могут быть изменены без необходимости изменять сам код, то сам код / переменные могут устареть. Например:
auto bThreadOK = CheckThreadHealth ();
За исключением проблемы, что CheckThreadHealth () в какой-то момент был подвергнут рефакторингу для возврата значения enum, указывающего состояние ошибки, если оно есть, вместо bool. Но человек, который сделал это изменение, пропустил проверку этой конкретной строки кода, и компилятор не помог, потому что он компилировался без предупреждений или ошибок.
- Возможно, вы никогда не узнаете, что такое настоящие типы. Это также часто указывается в качестве основного «преимущества» авто. Зачем изучать, что дает вам функция, когда вы можете просто сказать: «Кого это волнует? Она компилируется!»
Это даже вид работ, наверное. Я говорю, что это работает, потому что, несмотря на то, что вы делаете копию 500-байтовой структуры для каждой итерации цикла, так что вы можете проверить на ней одно значение, код все еще полностью функционален. Так что даже ваши модульные тесты не помогут вам понять, что плохой код скрывается за этим простым и невинно выглядящим автоматом. Большинство других людей, просматривающих файл, также не заметят его на первый взгляд.
Это также может быть ухудшено, если вы не знаете, что это за тип, но вы выбираете имя переменной, которое делает неверное предположение о том, что это такое, фактически достигая того же результата, что и в 1а, но с самого начала, а не после рефакторинга.
- Ввод кода при его первоначальном написании не самая трудоемкая часть программирования. Да, auto делает написание кода быстрее на начальном этапе. Как заявление об отказе, я набираю> 100 WPM, так что, возможно, это не беспокоит меня так же, как другие. Но если бы все, что мне нужно было сделать, это написать новый код весь день, я был бы счастливым туристом. Самая трудоемкая часть программирования - это диагностика трудно воспроизводимых ошибок в крае, часто возникающих в результате неочевидных неявных проблем, таких как, например, чрезмерное использование auto (ссылка или копия, подписанный и неподписанный, float против int, bool против указателя и т. д.).
Мне кажется очевидным, что auto был введен в первую очередь как обходной путь для ужасного синтаксиса со стандартными типами шаблонов библиотеки. Вместо того, чтобы пытаться исправить синтаксис шаблона, с которым люди уже знакомы - что также может быть почти невозможно сделать из-за всего существующего кода, который он может сломать - добавьте ключевое слово, которое в основном скрывает проблему. По сути то, что вы могли бы назвать "взломать".
На самом деле у меня нет никаких разногласий с использованием auto со стандартными контейнерами библиотеки. Это, очевидно, то, для чего было создано ключевое слово, и функции в стандартной библиотеке вряд ли кардинально изменят назначение (или тип в этом отношении), что сделает auto относительно безопасным для использования. Но я бы очень осторожно использовал его с вашим собственным кодом и интерфейсами, которые могут быть гораздо более нестабильными и потенциально подвержены более фундаментальным изменениям.
Еще одно полезное приложение auto, расширяющее возможности языка, - создание временных файлов в макросах, не зависящих от типа. Это то, что вы не могли сделать раньше, но вы можете сделать это сейчас.
auto
может часто усложнять чтение, когда их уже трудно прочитать, т. е. функции слишком длинные, переменные имеют неправильные имена и т. д. В коротких функциях с переменными именами с приличными именами знание типов должно быть одним из простых или второстепенных # 2.