Информация об изменениях

Сообщение насчет C++11/14 от 04.09.2015 18:04

Изменено 04.09.2015 18:06 lpd

Здравствуйте, alex_public, Вы писали:

_>Это полная ерунда. Я бы разделил изменения в стандарте C++11 (а C++14 — это всего лишь работа над ошибками в C++11) на следующие пункты:


_>1. Замыкания/лямбды. Очень важный пункт, позволяющий элементарно реализовывать потрясающие вещи (причём не только из мира ФП). Хотя естественно нечто подобное можно было делать и раньше (см. Boost), но ценой ужасающе кривого кода.

_>2. Семантика перемещения. Вообще потрясающая вещь, не имеющая прямых аналогов в других языках. Как раз она эффективно решает известную проблему с использованием замыканий без сборщика мусора. Но полезно оно не только для замыканий — с данной техникой производительность приложений на C++ уходит вообще в недостижимый отрыв. Причём что самое интересное, многие старые приложения могут ускориться даже без правки их кода — достаточно их перекомпилировать под новый стандарт.
_>3. Улучшения метапрограммирования (variadic template, constexpr, decltype и т.п.). Это отдельное направление в мире C++, очень активно развивающееся. И кстати говоря не имеющее аналогов в других мейнстрим языках. Правда во многом до сих пор кривое (т.к. изначально шаблоны не для этого придумывались), но работа идёт...
_>4. Мелкие синтаксические улучшения языка (nullptr, auto, range for, override, delete, final, explicit, static_assert, intX_t, литералы, инициализация членов класса, стандартная инициализация {}, using (тип), типизированные перечисления и т.д).
_>5. Расширение стандартной библиотеки: unique_ptr/shared_ptr, function, array, tuple, pair, initializer_list, atomic, thread (куча всего), chrono, regex и т.д. и т.п. Тут особо комментировать нечего, т.к. на самом деле все эти вещи были доступны и раньше (в том же Boost'e), просто теперь они поставляются в одной коробке с компилятором.

_>Так вот пункты 1, 4 и 5 ведут исключительно к упрощению кода. Пункт 2 не меняет особо внешний вид кода, только ускоряя его. По пути усложнения идёт только пункт 3, но его никто не заставляет использовать насильно.

Любую программу, которую вы напишете с помощью лямбд, я напишу без них. И ни мне, ни другим программистам не прийдется запоминать синтаксис лямбд или мелких улучшений языка. Автоопределение возвращаемого функцией типа это ужас, т.к. чтобы понять что мне функция вернет, прийдется читать ее код.
Повторюсь, я не против умных указателей и некоторых других улучшений. Но во многих случаях язык становится сложнее без необходимости в этом. Синтаксис C++ интуитивен для любого, кто впервые читает книжку по C++. Расширения C++11 и C++14 требуют запоминать новые обороты — в программировании/администрировании достаточно вещей, которые нужно помнить и без них. Это все для людей, которые именно увлекаются языками программирования, как теорией.
Здравствуйте, alex_public, Вы писали:

_>Это полная ерунда. Я бы разделил изменения в стандарте C++11 (а C++14 — это всего лишь работа над ошибками в C++11) на следующие пункты:


_>1. Замыкания/лямбды. Очень важный пункт, позволяющий элементарно реализовывать потрясающие вещи (причём не только из мира ФП). Хотя естественно нечто подобное можно было делать и раньше (см. Boost), но ценой ужасающе кривого кода.

_>2. Семантика перемещения. Вообще потрясающая вещь, не имеющая прямых аналогов в других языках. Как раз она эффективно решает известную проблему с использованием замыканий без сборщика мусора. Но полезно оно не только для замыканий — с данной техникой производительность приложений на C++ уходит вообще в недостижимый отрыв. Причём что самое интересное, многие старые приложения могут ускориться даже без правки их кода — достаточно их перекомпилировать под новый стандарт.
_>3. Улучшения метапрограммирования (variadic template, constexpr, decltype и т.п.). Это отдельное направление в мире C++, очень активно развивающееся. И кстати говоря не имеющее аналогов в других мейнстрим языках. Правда во многом до сих пор кривое (т.к. изначально шаблоны не для этого придумывались), но работа идёт...
_>4. Мелкие синтаксические улучшения языка (nullptr, auto, range for, override, delete, final, explicit, static_assert, intX_t, литералы, инициализация членов класса, стандартная инициализация {}, using (тип), типизированные перечисления и т.д).
_>5. Расширение стандартной библиотеки: unique_ptr/shared_ptr, function, array, tuple, pair, initializer_list, atomic, thread (куча всего), chrono, regex и т.д. и т.п. Тут особо комментировать нечего, т.к. на самом деле все эти вещи были доступны и раньше (в том же Boost'e), просто теперь они поставляются в одной коробке с компилятором.

_>Так вот пункты 1, 4 и 5 ведут исключительно к упрощению кода. Пункт 2 не меняет особо внешний вид кода, только ускоряя его. По пути усложнения идёт только пункт 3, но его никто не заставляет использовать насильно.

Любую программу, которую вы напишете с помощью лямбд, я напишу без них. И ни мне, ни другим программистам не прийдется запоминать синтаксис лямбд или мелких улучшений языка. Автоопределение возвращаемого функцией типа это ужас, т.к. чтобы понять что мне функция вернет, прийдется читать ее код.
Повторюсь, я не против умных указателей и некоторых других улучшений. Но во многих случаях язык становится сложнее без необходимости в этом. Синтаксис C++ интуитивен для любого, кто впервые читает книжку по C++. Расширения C++11 и C++14 требуют запоминать новые обороты — в программировании/администрировании достаточно вещей, которые нужно помнить и без них. Это все для людей, которые именно увлекаются языками программирования как теорией.