Далеко же мы отошли от стандарта С++, однако.
Ваша философия, по-видимому, что язык должен вести програмиста на помочах. Но хочу заметить, что понимание "что такое хорошо и что такое плохо" меняется со временем под давлением практики программирования.
Я часто привожу пример: допустим у нас есть множество возможностей языка. Для выполнения прожекта мне нужно другое множество. Эти два множества, пересекаясь, дают три сегмента: возможности используемые в прожекте, возможности, отсутсвующие в языке, но нужные для прожекта, и возможности, не используемые в прожекте.
С используемыми возможностями все понятно. С нехватающими -- более или менее тоже. Мы их будем моделировать, используя имеющиеся конструкции языка. Например, замоделируем в С таблицу виртуальных методов при помощи указателя на отдельную структуру. Плохо, конечно. Создает нагромождения синтаксического шлака, который уменьшает
читаемость програм и увеличивает вероятность ошибок. Теперь вместо одной лексемы надо предложение писать.
На неиспользуемые возможности языка обращают куда меньшее внимание. Хотя их влияние весьма многогранно. Первый -- статический аспект -- состоит в том, что компилятор считает правильной программой то, что человек зачастую считает ошибочной (вопросы такого типа часты у новичков -- а как это вообще скомпилировалось?!). В результате ошибка оказывается незамеченной, в лучшем случае до времени отладки (классический пример времен Фортрана-4:
FOR 30 I = 1,5, где по ошибке запятая была заменена на точку, и оператор цикла стал операторм присваивания
FOR30I = 1.5). С другой стороны, становяться менее понятными сообщения компилятора о синтаксических ошибках (если вообще понятными), поелику очень часто ошибка формулируется в терминах и конструкциях неизвестных программисту. В динамическом же плане неиспользуемые конструкции зачастую удорожают поведение используемых, причем иногда весьма заметно.
Поэтому идеальна ситуация, когда максимальна именно средняя часть. Когда мы минимум моделируем и максимум используем. Такого, понятно, не бывает, но к этому стремиться развитие. В частности,
goto все таки уходит из програм. Не только и не столько потому, что вреден, а потому что его функция (там где он был полезен) теперь выполняется "структурными" операторами управления циклом (
break,
continue) и обработкой исключительных ситуаций. Да и то -- Вам никогда не нужно было прервать два цикла? И сколько это кода городило?
А сужение языка (оператор
paradigm) так же нужны, как и описания
int i -- то есть, не нужны вовсе. Как показывает практика, строгая типизация значений (но не переменных) работает очень хорошо, и не приводит к увеличению количества ошибок. Но декларации, подобные вышеприведенной, становятся не нужными. Программы, написанные нормальными людьми, остаются весьма читаемыми. По видимому, программисту нужно очень мало костылей (типа венгерской нотации).