Задать вопрос
Daniro_San
@Daniro_San
Программист

C++11, C++14. Использование auto — признак дурного тона?

C++11 и 14 принесли много новых плюшек. Так сложилось, что разбираться с ними я начал совсем недавно.
Например auto в объявлении функции. Сдается мне что это может быть совсем не хорошая вещь.
auto Func()
{
    // ...
    int a=0;
    // код код и еще код
    // ...
    return a+1;
}
// ... 
// Где нибудь внизу
auto var=Func();
// ...

Я пониманию использование auto в циклах, но здесь?
Это действительно нормально или auto стоит избегать?
  • Вопрос задан
  • 1442 просмотра
Подписаться 4 Оценить Комментировать
Решения вопроса 4
Nipheris
@Nipheris Куратор тега C++
Такие дельные советы тут...

А правило проще некуда: если вы без указания типа и так УЖЕ ИМЕЕТЕ достаточно информации, чтобы уверенно работать со значением - тогда можно использовать auto. Если чувствуете, что не имеете, или сомневаетесь, что имеете - лучше тип указать. Пример, где использование auto отлично подходит - итераторы:
std::list<int> items;
auto i = items.cbegin();

Во второй строке четко написано - items.cbegin - константный итератор по items, бегущий с начала списка. Мне этого более чем достаточно. Указание типа std::list<int>::const_iterator мне никакой новой информации не принесет. Тем более, т.к. итераторы от разных контейнеров несовместимы, то мне нужно еще и сразу знать, по какому конкретно списку у меня итератор - я опять-таки посмотрю на items.cbegin, а не на тип.

А вот auto в объявлениях функций/методов и правда ни к чему. Его, кстати, даже не сразу там разрешили использовать (только в C++14). Причина тому вновь читабельность - чтобы понять, что возращает функция, нужно прочесть ее текст как минимум до первого return, а лучше - полностью. Единственный сценарий, где без auto не обойтись при указании возвращаемого типа - это стрелочная нотация с decltype, но я думаю вы не скоро с ней столкнетесь.
Ответ написан
Комментировать
auto в заголовке функции - дурной тон.
В объявлении переменной - стандартная практика.
Ответ написан
Комментировать
@beduin01
Все правильно понимаете. Операторы часто усложняют понимание кода т.к. не ясно какой тип данных перед вами.
Ответ написан
Комментировать
@Mace_UA
Нет, это не признак дурного тона. Auto -- замечательная фича, позволяющая сделать код более читабельным. Но, как и практически любая хорошая фича C++, она может сделать вам только хуже, если применять её без надобности там, где она не нужна. Поэтому поддерживаю уже высказанное здесь мнение
если вы без указания типа и так УЖЕ ИМЕЕТЕ достаточно информации, чтобы уверенно работать со значением - тогда можно использовать auto. Если чувствуете, что не имеете, или сомневаетесь, что имеете - лучше тип указать.


При объявлениях функций auto в качестве типа возвращаемого значения вы так просто не напишете. Это должны быть инлайн функции. Как правило, такая потребность может встретиться разве что при написании шаблонов, которые реализуются прямо в хедере и для методов в которых порой вывести тип возвращаемого значения без auto крайне тяжело. Если вы школьник и не так давно программируете, на ближайшее время вообще забудьте про такую возможность. Она вам не нужна. А для разработчиков всяких хитроумных шаблонных библиотек это может быть очень даже полезной фичей.

И ещё один аргумент за использование auto при определении переменных. Большинство современных IDE нормально справляются с тем, чтобы сообщить вам тип переменной, когда вы просто наводите мышкой на её имя, даже если она объявлена как auto. Это во многих случаях смягчает негативные стороны использования auto, если таковые вообще имели место в данном куске кода.

А для более "продвинутых" программистов рекомендую к прочтению вот эту статью Герба Саттера. Всё прекрасно разложил по полочкам насчёт использования auto и объяснил, почему это в большинстве случаев не так страшно, как некоторым кажется на первый взгляд. Конечно, предложенная в конце идиома "almost always auto" спорная, C++ это всё-таки не джаваскрипт. Но остальное написано очень разумно.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@jackroll
Сверхразум
Продолжайте разбираться.
Ответ написан
Комментировать
romy4
@romy4
Exception handler
Если вы работаете с объектами, то иногда для понимания auto проще использовать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы