TL; DR: см. Практическое правило внизу.
В принятом ответе предлагается следующее правило:
Используйте auto
всякий раз, когда трудно сказать, как написать тип с первого взгляда, но тип правой части выражения очевиден.
Но я бы сказал, что этослишком ограничительныйИногда меня не интересуют типы, так как утверждение достаточно информативно, и я не удосужился потратить время на выяснение типа.Что я имею в виду под этим?Рассмотрим пример, который всплыл в некоторых ответах:
auto x = f();
Что делает это примером неправильного использования auto
?Это мое невежество относительно типа возврата f()
?Ну, это действительно может помочь, если бы я знал это, но - это не моя главная забота.Проблема в том, что x
и f()
довольно бессмысленны.Если вместо этого у нас было:
auto nugget = mine_gold();
, то мне, как правило, все равно, очевиден ли возвращаемый тип функции или нет.Читая утверждение, я знаю, что делаю, и знаю достаточно о том, что такое семантика возвращаемого значения, чтобы не чувствовать, что мне нужно также знать его тип.
Поэтому мой ответ таков: используйте auto
всякий раз, когда компиляторпозволяет, если:
- Вы чувствуете, что имя переменной вместе с выражением инициализации / присваивания не предоставляют достаточно информации о том, что делает оператор.
- Вы чувствуете имя переменной вместес помощью выражения инициализации / присваивания предоставляет «вводящую в заблуждение» информацию о том, каким должен быть тип - то есть, если бы вам пришлось угадывать, что приходит вместо auto, вы могли бы сделать предположение - и это было бы неправильно, и это ложное предположениепозже в коде будут последствия.
- Вы хотите использовать другой тип (например, ссылку).
А также:
- Предпочитаете даватьосмысленное имя (которое не содержит имени типа, конечно) перед заменой
auto
на конкретный тип.