La domanda era seria (altrimenti ci avrei messo le faccine).
secondo me per fornire una standardizzazione al modo di programmare, smart pointer e container sono resi standard per evitare un uso improprio e metodi di programmazione impropria o deprecata per il tempo e per il linguaggio.
Esatto, e il vero motivo di tutto ciò è: evitare che il programmatore debba occuparsi dei dettagli nella gestione della memoria, cioè puntatori.
Se ci fai caso, nei libri sul C++ viene mostrata la gestione di stringhe in stile C contrapposto alle std::string, oppure agli array dinamici (fatti con new o malloc) vs std::vector.
Oltre a mostrare la semplicità di gestione delle strutture dati C++, di solito viene messo in rilievo il comportamento dei due stili di programmazione in relazione alle eccezioni. Nel primo caso è il programmatore a doversi preoccupare di gestire la memoria per evitare memory leak, nel secondo caso è la struttura dati (string, vector o quel che è) a occuparsene in automatico. E questo è un punto fondamentale perché non si sa mai se e quando viene lanciata un'eccezione.
La move semantics non è un'idea nuova, ne aveva già parlato Alexandrescu nel 2003, ma solo con una modifica nel kernel del linguaggio poteva essere effettuata nativamente.
L'idea di fondo è: invece di copiare i dati durante i vari passaggi di variabili è possibile semplicemente trasferire questi dati, mantenendo una minima exception safety?
Perché il nocciolo della questione è tutta qui: affidare la gestione delle risorse al programmatore rischia di causare problemi non immediatamente visibili; lasciarla al linguaggio tramite paradigma RAII, invece, fa dormire al programmatore sonni relativamente tranquilli, proprio perché sa che le risorse saranno rilasciate in automatico (non dimenticare che la memoria è solo una risorsa e in certi casi è pure la meno importante).
Per gli smart pointer il discorso è simile ed quanto di più vicino si avvicini a un raw pointer. Hanno dei limiti intrinseci, ma per il 90% dei casi possono gestire la memoria per te.
In sostanza Il C++ moderno cerca di minimizzare e scoraggiare l'uso di raw pointer e privilegiare invece l'uso di container o strutture dati "intelligenti" che gestiscano la memoria senza intervento del programmatore, ma fino al C++11 l'uso di queste strutture era scoraggiato dal fatto che potevano essere solo copiate se restituite da una funzione. E se queste strutture (Es. Un vector di strutture) era grosse, le performance ne risentivano.
La move semantics, permettendo il trasferimento dei dati, velocizza l'operazione che in pratica diventa immediata. E tutto questo lasciando la exception safety e gestione risorse al linguaggio.
Dal mio punto di vista, più che lambda function, smart pointer o il nuovo range for, è la move semantics ad aver migliorato il C++.
comunque non volevo perdere tempo o farti perdere tempo, era solo per capire.
Non so che ti abbia dato questa impressione, ma imparare e/o spiegare non è mai una perdita di tempo.