Существует две категории.
auto
можно избежать стирания типа. Существуют неизмеримые типы (например, lambdas) и почти неуязвимые типы (например, результат std::bind
или другие подобные шаблону выражения).
Без auto
, вам в итоге нужно напечатать данные, удаляющиеся примерно до std::function
. Тип стирания стоит.
std::function<void()> task1 = []{std::cout << "hello";};
auto task2 = []{std::cout << " world\n";};
task1
имеет тип стирание накладных расходов - возможное выделение динамической памяти, трудности встраивание его, и накладные расходы виртуальной таблицы функций вызова. task2
не имеет. Lambdas необходимо авто или другие формы вывода типа для хранения без стирания типа; другие типы могут быть настолько сложными, что им это нужно только на практике.
Во-вторых, вы можете получить неправильные типы. В некоторых случаях неправильный тип будет работать отлично, но приведет к копированию.
Foo const& f = expression();
будет собирать, если expression()
возвращает Bar const&
или Bar
или даже Bar&
, где Foo
могут быть построены из Bar
. Будет создан временный Foo
, а затем привязан к f
, и его срок службы будет продлен до тех пор, пока f
не уйдет.
Программист, возможно, имел в виду Bar const& f
и не предназначен для копирования там, но копия выполняется независимо.
Наиболее распространенным примером является тип *std::map<A,B>::const_iterator
, то есть std::pair<A const, B> const&
не std::pair<A,B> const&
, но ошибка является категорией ошибок, которые бесшумно оценивают стоимость. Вы можете построить std::pair<A, B>
от std::pair<const A, B>
. (Ключ на карте const, потому что редактирование - плохая идея)
Оба @Barry и @KerrekSB впервые проиллюстрировали эти два принципа в своих ответах. Это просто попытка выделить два вопроса в одном ответе, с формулировкой, которая направлена на проблему, а не на пример-ориентированную.
См. Http://herbsutter.com/2013/06/13/gotw-93-solution-auto-variables-part-2/, в котором говорится об избежании случайных неявных преобразований, например. от гаджета до виджета. Это не обычная проблема. –
Вы принимаете «делает его менее вероятным для непреднамеренного пессимизма» как улучшение производительности? – 5gon12eder
Перенос кода очистки только в будущем, возможно – Croll