Легко.Используйте его, когда вам все равно , какой тип.Например,
for (const auto & i : some_container) {
...
Все, что меня волнует, это то, что i
- это то, что находится в контейнере.
Это немного похоже на typedefs.
typedef float Height;
typedef double Weight;
//....
Height h;
Weight w;
Здесь,Мне все равно, являются ли h
и w
числами с плавающей запятой или двойниками, только то, что они являются независимо от того, какой тип подходит для выражения высоты и веса .
Или рассмотрим
for (auto i = some_container .begin (); ...
Здесь все, что меня волнует, это то, что это подходящий итератор, поддерживающий operator++()
, в этом смысле это похоже на ввод с уткой.
Также тип лямбд не может быть записан, поэтомуauto f = []...
это хороший стиль.Альтернативой является приведение к std::function
, но это связано с накладными расходами.
Я не могу себе представить "злоупотребление" auto
.Самое близкое, что я могу себе представить, - это лишить себя явного преобразования в какой-либо значимый тип - но вы бы не использовали для этого auto
, вы бы создали объект нужного типа.
Если вы может удалить некоторую избыточность в вашем коде, не вызывая побочных эффектов, тогда это должно быть хорошим для этого.
Контрпримеры (заимствованные из чужих ответов):
auto i = SomeClass();
for (auto x = make_unsigned (y); ...)
Здесь нам НЕОБХОДИМО, что это за тип, поэтому мы должны написать Someclass i;
и for(unsigned x = y;...