Список в конце поста написан Лавсаном 2 года назад. (2011-03-23 19:56:00) (источник)
Надеюсь, автор не подаст жалобу в Роспатент за перепечатку :-)
Кстати, sudo cast lovesan.
Чтобы проверить актуальность вопроса, всю последнюю неделю я долго и нудно использовал этот список в дискуссиях. Чтобы разобрать отдельные пункты отдельно.
Временное резюме: С++ всё еще актуален по историческим причинам. Еще есть мобилки (sudo cast mono), гиперкластеры для шиндовс 3.11 (sudo cast vromanov) и базы данных. Т.к. он актуален, но не предназначен ни для чего (см. выводы в конце списка) новых специалистов по нему должно быть мало. Маленькая конкуренция на огромной области применения — огромное лавэ $$$. Вот это и есть истинная причина использовать кресты — возможность срубить €€€.
Честно говоря, «хитрый план» мне уже очень надоел, поэтому пора открыть карты.
Заодним, крестопоклонники смогут выйти на последний и решительный бой, т.к. сегодня пятница и вечером будет время пообщаться. Поклонникам мамкиного борща тоже наверняка есть что добавить, конструктивно и аргументированно.
Вот этот список:
- Вырвиглазный синтаксис и контекстно-зависимая грамматика
- медленная компиляция
- частые «internal error» в компиляторах
- код плохо читается и его сложно поддерживать
- разбор кода различными инструментами, вроде IDE, и его генерация - сильно затруднены
- ручное управление памятью
- неудобства при работе с динамической памятью
- утечки памяти
- висячие ссылки
- сегфолты
- стандартные средства, как то malloc/new, работают медленно
- фрагментация кучи
- велосипедные аллокаторы на каждом шагу
- которые далеко не факт что эффективнее malloc/new
- велосипедные счетчики ссылок на каждом шагу, опять же
- медленная работа
- перерасход по памяти
- отладка затруднена
- написание GC, по факту, невозможно, отчасти из-за (5), (7) и (8)
- Никакого ABI
- Нестандартизированный и непредсказумый name mangling
- Дублирование функционала Си
- сами фичи из Си никуда не деваются при этом
- отчасти из-за того, что по функционалу превосходят аналоги из C++
- запутывает новичков
- malloc - new/new[], free - delete/delete[]
- препроцессор - шаблоны
- указатели - ссылки
- ссылка не может быть NULL, что способствует появлению висячих ссылок и сегфолтов
- структуры - классы
- stdio - iostream
- сами фичи из Си никуда не деваются при этом
- Стандартная библиотека убога
- Отсутствует даже такой функционал, как вменяемая работа со строками и многомерные массивы
- Юникод?
- Отсутствует даже такой функционал, как вменяемая работа со строками и многомерные массивы
- Слабая типизация
- способствует ошибкам
- затрудняет отладку
- const не дает абсолютно никаких гарантий
- при этом система типов невероятно переусложенена
- в основном из-за пунктов (2), (5) и (9)
- медленная компиляция
- частые внутренние ошибки в компиляторах
- объектая система убога
- практически никакой интроспекции
- отладка затруднена
- передача объектов по значению
- понятие идентичности объекта теряет смысл
- добавляет сложностей в управлении памятью
- добавляет сложностей при отладке
- используется часто, по причине (2)
- перерасход по памяти
- медленная работа
- множественное наследование неудобно в использовании
- проблема ромба по дефолту не разрешается никак
- исключения в конструкторах гарантированно влекут утечку памяти
- исключения в деструкторах тоже, и просто утечку - еще в лучшем случае
- коды ошибок деструкторы и конструкторы возвращать не могут
- ошибки в них не обработать никак
- поэтому ими стараются не пользоваться
- раздувание кода
- поэтому ими стараются не пользоваться
- ошибки в них не обработать никак
- коды ошибок деструкторы и конструкторы возвращать не могут
- исключения в деструкторах тоже, и просто утечку - еще в лучшем случае
- деструктор можно вызывать до выхода из блока кода, или до delete
- гарантированная утечка ресурсов/сегфлот
- это не предотвратить никак, деструктор обязан быть public
- одиночная диспетчеризация
- виртуальные методы в конструкторах не работают
- реализована убого
- pure virtual function call
- сложности в случае с множественным наследованием
- деструкторы обязаны быть виртуальными
- по дефолту - не виртуальные
- никаких интерфейсов, только классы
- порядок инициализации статических членов классов не определен
- private, public и protected не дают никаких гарантий сокрытия данных
- к инкапсуляции же не относятся совершенно никак
- отсутствие «свойств»
- вынуждает городить getter'ы и setter'ы
- раздувание кода
- размывание интерфейса класса
- вынуждает городить getter'ы и setter'ы
- неявно генерирумые конструкторы, деструкторы и операторы присваивания
- «friend» нарушают инкапсуляцию
- практически никакой интроспекции
- шаблоны
- очень сильно замедляют компиляцию
- раздувание кода
- обфускация кода
- результат раскрытия плохо предсказуем
- сложности в отладке
- километровые и плохо читаемые сообщения об ошибках при компиляции
- нарушают инкапсуляцию
- обязаны содержать реализацию в заголовочных файлах
- позволяют генерировать некорректный код
- исключения
- отсутствие finally/unwind-protect
- заставляет городить классы ради одних деструкторов
- раздувание кода
- медленная компиляция
- медленная работа
- заставляет городить классы ради одних деструкторов
- конфликтуют с другими возможностями языка
- конструкторы/деструкторы
- ручное управление памятью
- работают медленно
- малофункциональны (ср. CL condition system)
- отсутствие finally/unwind-protect
По причинам 3, 4, 5, 9 и 10 C++ совершенно неприменим для системного и низкоуровневого программирования. А по причинами 1, 2, 5, 6, 7, 8, и, опять же, 9 и 10 - и для прикладного.
У C++ нет области применения.