Anni fa credevo che C fosse assolutamente puro rispetto a C++ perché il compilatore non poteva generare alcun codice che non si poteva prevedere. Ora credo che gli esempi contrari includano la parola chiave volatile
e le barriere della memoria (nella programmazione multiprocessore o driver di periferica per dispositivi hardware mappati in memoria, dove il linguaggio di assemblaggio semplice sarebbe ancora più puro delle ottimizzazioni di un compilatore C).Modi per creare accidentalmente oggetti temporanei in C++?
Al momento sto cercando di enumerare le cose imprevedibili che un compilatore C++ può fare. La lamentela principale che mi viene in mente riguardo al C++ è che il compilatore istanzia implicitamente degli oggetti temporanei, ma credo che questi casi possano tutti essere previsti. I casi che sto pensando di sono:
- quando una classe definisce un costruttore di copia di un tipo diverso da sé, senza utilizzare la parola chiave
explicit
- Quando una classe definisce un operatore di conversione di overload:
operator()
- quando una funzione accetta un oggetto per valore invece che con riferimento
- quando una funzione restituisce un oggetto per valore invece che con riferimento
sono la re altri?
+1: interessante quando si tratta di sistemi embedded. – jldupont
Questi sono tutti definiti nello standard e quindi possono essere previsti - quelli che non possono essere previsti sono comportamenti non definiti – Mark
In C si hanno conversioni implicite (cast), quindi non direi che è "puro". – Manuel