Это, вероятно, не будет популярным ответом, но я думаю, что C ++ отличает его возможности во время компиляции, например шаблоны и #define. Вы можете выполнять любые виды обработки текста в своей программе, используя эти функции, большая часть которых была оставлена в более поздних языках во имя простоты. Для меня это намного важнее, чем любое низкоуровневое переключение битов, которое предположительно проще или быстрее в C ++.
C #, например, не имеет реальной возможности макросов. Вы не можете #include другой файл непосредственно в исходный код, или использовать #define для управления программой в виде текста. Вспомните, когда вам приходилось механически печатать повторяющийся код, и вы знали, что есть лучший способ. Возможно, вы даже написали программу для генерации кода для вас. Ну, препроцессор C ++ автоматизирует все эти вещи.
Средство «дженериков» в C # также ограничено по сравнению с шаблонами C ++. C ++ позволяет применять оператор точки к типу шаблона T вслепую, вызывая (например) методы, которые могут не существовать, и проверки на корректность применяются только после того, как шаблон фактически применяется к определенному классу. Когда это произойдет, если все предположения, которые вы сделали относительно T, на самом деле верны, то ваш код скомпилируется. C # не допускает этого ... тип "T" в основном должен рассматриваться как объект, то есть с использованием только наименьшего общего знаменателя операций, доступных для всего (присваивание, GetHashCode (), Equals ()).
C # покончил с препроцессором и реальными обобщениями во имя простоты. К сожалению, когда я использую C #, я пытаюсь найти заменители этих конструкций C ++, которые неизбежно являются более раздутыми и многослойными, чем подход C ++. Например, я видел, как программисты обходили отсутствие #include несколькими раздутыми способами: динамически связывая с внешними сборками, переопределяя константы в нескольких местах (один файл на проект) или выбирая константы из базы данных и т. Д.
Как однажды сказала мисс Крэбпл из "Симпсона", это "довольно отстой, Милхаус".
С точки зрения компьютерных наук, эти функции времени компиляции в C ++ обеспечивают такие вещи, как передача параметров по имени, которая, как известно, является более мощной, чем вызов по значению и вызов по ссылке.
Опять же, это, возможно, не самый популярный ответ - любой вводный текст на C ++ предупредит вас, например, о #define. Но, работая в течение многих лет с широким спектром языков и учитывая теорию, лежащую в основе всего этого, я думаю, что многие люди дают плохие советы. Похоже, это особенно относится к разведенному подполю, известному как «ИТ».