Все-таки люди, программирующие на Java, имеют особый склад ума (что, в принципе, ожидаемо, учитывая свойства этого языка программирования). Иначе сложно объяснить волнения, вызванные намерениями добавить в Java ключевое слово var (например, вот статья с попытками рассмотреть доводы "за" и "против" на Хабре и уже не маленькое обсуждение на LOR-е).
Странные люди. Смотреть нужно в первую очередь на то, что можно получить от автоматического вывода типа локальной переменной. Насколько я помню, именно необходимость такого вывода стала причиной добавления var-ов в C#, т.к. без этого реализация и использование LINQ вряд ли были бы возможны. Да и в C++11, после добавления в язык variadic templates и lambdas без auto уже никуда. Ну вот серьезно, сейчас в C++ я могу написать вот так:
std::thread first; std::thread second; std::thread third; auto thr_joiner = so_5::auto_join(first, second, third); |
И, на мой взгляд, это гораздо лучше, чем заставлять программиста писать вот так:
std::thread first; std::thread second; std::thread third; so_5::threads_auto_joiner<3> thr_joiner = so_5::auto_join(first, second, third); |
Еще веселее дела обстоят с лямбда-функциями, для которых тип генерируется самим компиляторам и который неизвестен программисту. Ключевое слово auto позволяет вот так:
std::FILE * f = std::fopen(file_name, "r"); if( f ) { auto f_closer = at_scope_exit([f]{ std::fclose(f); }); ... } |
А если бы его не было, как бы пришлось извращаться? Писать что-то вроде:
std::FILE * f = std::fopen(file_name, "r"); if( f ) { at_exit_t< std::function<void()> > f_closer = at_scope_exit([f]{ std::fclose(f); }); ... } |
Как говорится, нет уж, спасибо ;)
Понятное дело, что автоматический локальный вывод типов способен усложнить понимание кода. Но это уже плата за расширение возможностей. Ведь даже в показанных выше очень простых примерах без var/auto сложно, что уж говорить про более сложные случаи с трехэтажными шаблонами.
Так что, на мой взгляд, очень странные обсуждения ведутся в стане Java-программистов. Впрочем, там язык настолько убог, что может var просто поздно добавлять... :)
Касательно auto в C++. До тех пор, пока не работаешь плотно с навороченными шаблонными конструкциями, к auto относишься настороженно. Ведь, действительно, код, в котором сплошные auto, прочитать сложнее, чем код со всеми аннотациями типов. Однако, даже если речь идет о более-менее простых ситуациях, без шаблонных наворотов, то оказывается, что auto может повысить качество и безопасность кода. Взять, скажем, совсем свежий пример:
char *path_name(const struct name_path *path, const char *name) { const struct name_path *p; char *n, *m; int nlen = strlen(name); int len = nlen + 1; |
Ведь будь он написан вот в таком виде:
char *path_name(const struct name_path *path, const char *name) { const struct name_path *p; char *n, *m; auto nlen = strlen(name); auto len = nlen + 1; |
Менее понятным он бы не стал. А вот надежнее -- наверняка.
Впрочем, более обстоятельно эту тему раскрывают люди, разбирающиеся в C++ гораздо лучше меня.