Tutte le lingue non dovrebbero cercare di incorporare tutte le funzionalità di ogni altra lingua.
Il C ++ è essenzialmente un assemblatore di macro molto, molto sofisticato. NON è (in senso tradizionale) un linguaggio di alto livello come C #, Java, Objective-C, Smalltalk, ecc.
È utile disporre di strumenti diversi per diversi lavori. Se abbiamo solo dei martelli, tutto sembrerà un chiodo, ecc. Avere linguaggi di script è utile per alcuni lavori e linguaggi OO riflessivi (Java, Obj-C, C #) sono utili per un'altra classe di lavori, e super linguaggi vicini alla macchina a basso consumo efficienti sono utili per l'ennesima classe di lavori (C ++, C, Assembler).
Il C ++ fa un lavoro straordinario estendendo la tecnologia dell'Assemblatore a livelli incredibili di gestione della complessità e astrazioni per rendere la programmazione di compiti più grandi e complessi molto più possibili per gli esseri umani. Ma non è necessariamente un linguaggio che è il più adatto per coloro che stanno affrontando il loro problema da una prospettiva strettamente di alto livello (Lisp, Smalltalk, Java, C #). Se hai bisogno di una lingua con queste funzionalità per implementare al meglio una soluzione ai tuoi problemi, allora ringrazia quelli che hanno creato tali lingue da usare per tutti noi!
Ma C ++ è per coloro che, per qualsiasi motivo, devono avere una forte correlazione tra il loro codice e il funzionamento della macchina sottostante. Che si tratti di efficienza, di driver di dispositivo di programmazione o di interazione con i servizi del sistema operativo di livello inferiore, o qualsiasi altra cosa, C ++ è più adatto a tali compiti.
C #, Java, Objective-C richiedono tutti un sistema di runtime molto più grande e ricco per supportare la loro esecuzione. Tale runtime deve essere consegnato al sistema in questione, preinstallato per supportare il funzionamento del software. E quel livello deve essere mantenuto per vari sistemi target, personalizzato da QUALCHE ALTRO LINGUA per farlo funzionare su quella piattaforma. E quel livello intermedio - quello strato adattivo tra il sistema operativo host e il tuo codice - il runtime, è quasi sempre scritto in un linguaggio come C o C ++ in cui l'efficienza è il numero 1, dove comprendere prevedibilmente l'esatta interazione tra software e hardware può essere buona capito e manipolato al massimo guadagno.
Adoro Smalltalk, Objective-C e avere un ricco sistema di runtime con riflessi, metadati, garbage collection, ecc. È possibile scrivere un codice straordinario per sfruttare queste funzionalità! Ma questo è semplicemente un livello superiore nello stack, un livello che deve poggiare su livelli inferiori, che a loro volta devono sedere sul sistema operativo e sull'hardware. E avremo sempre bisogno di un linguaggio che sia il più adatto per costruire quel livello: C ++ / C / Assembler.
Addendum: C ++ 11/14 sta continuando ad espandere la capacità di C ++ di supportare sistemi e astrazioni di livello superiore. Threading, sincronizzazione, modelli di memoria precisi, definizioni di macchine astratte più precise stanno consentendo agli sviluppatori di C ++ di realizzare molte delle astrazioni di alto livello su cui alcuni di questi linguaggi solo di alto livello avevano un dominio esclusivo, pur continuando a fornire quasi prestazioni del metallo ed eccellente prevedibilità (ovvero sottosistemi di runtime minimi). Forse le strutture di riflessione saranno abilitate in modo selettivo in una futura revisione del C ++, per coloro che lo desiderano - o forse una libreria fornirà tali servizi di runtime (forse ce n'è uno ora, o l'inizio di uno in fase di potenziamento?).