Toutes les langues ne devraient pas essayer d'incorporer toutes les fonctionnalités de toutes les autres langues.
C ++ est essentiellement un assembleur de macros très, très sophistiqué. Ce n'est PAS (au sens traditionnel) un langage de haut niveau comme C #, Java, Objective-C, Smalltalk, etc.
Il est bon d'avoir différents outils pour différents emplois. Si nous n'avons que des marteaux, tout ressemblera à des clous, etc. les langages dépouillés efficaces proches de la machine sont utiles pour une autre classe de travaux (C ++, C, assembleur).
C ++ fait un travail incroyable en étendant la technologie Assembler à des niveaux incroyables de gestion de la complexité et des abstractions pour rendre la programmation plus vaste et plus complexe pour les êtres humains. Mais ce n'est pas nécessairement un langage qui convient le mieux à ceux qui abordent leur problème dans une perspective strictement de haut niveau (Lisp, Smalltalk, Java, C #). Si vous avez besoin d'une langue avec ces fonctionnalités pour implémenter au mieux une solution à vos problèmes, alors remerciez ceux qui ont créé ces langues pour nous tous!
Mais C ++ est destiné à ceux qui, pour une ou plusieurs raisons, ont besoin d'avoir une forte corrélation entre leur code et le fonctionnement de la machine sous-jacente. Que ce soit son efficacité, ou les pilotes de périphériques de programmation, ou l'interaction avec les services de système d'exploitation de niveau inférieur, ou autre, C ++ est mieux adapté à ces tâches.
C #, Java, Objective-C nécessitent tous un système d'exécution beaucoup plus grand et plus riche pour prendre en charge leur exécution. Ce runtime doit être fourni au système en question - préinstallé pour prendre en charge le fonctionnement de votre logiciel. Et cette couche doit être maintenue pour divers systèmes cibles, personnalisée par QUELQUES AUTRES LANGUES pour la faire fonctionner sur cette plate-forme. Et cette couche intermédiaire - cette couche adaptative entre le système d'exploitation hôte et votre code - le runtime, est presque toujours écrite dans un langage comme C ou C ++ où l'efficacité est n ° 1, où la compréhension prévisible de l'interaction exacte entre logiciel et matériel peut être bien compris et manipulé au maximum.
J'adore Smalltalk, Objective-C et avoir un système d'exécution riche avec réflexion, métadonnées, collecte de déchets, etc. Un code incroyable peut être écrit pour tirer parti de ces fonctionnalités! Mais il s'agit simplement d'une couche supérieure de la pile, une couche qui doit reposer sur des couches inférieures, qui elles-mêmes doivent finalement reposer sur le système d'exploitation et le matériel. Et nous aurons toujours besoin d'un langage qui convient le mieux à la construction de cette couche: C ++ / C / Assembler.
Addendum: C ++ 11/14 continue d'étendre la capacité de C ++ à prendre en charge les abstractions et les systèmes de niveau supérieur. Le threading, la synchronisation, des modèles de mémoire précis, des définitions de machines abstraites plus précises permettent aux développeurs C ++ de réaliser de nombreuses abstractions de haut niveau sur lesquelles certains de ces langages de haut niveau uniquement avaient un domaine exclusif, tout en continuant à fournir des performances métalliques et excellente prévisibilité (c.-à-d. sous-systèmes d'exécution minimaux). Peut-être que les fonctionnalités de réflexion seront activées de manière sélective dans une future révision de C ++, pour ceux qui le souhaitent - ou peut-être qu'une bibliothèque fournira de tels services d'exécution (peut-être qu'il y en a un maintenant, ou les débuts d'un dans boost?).