La classe std::string è una classe molto complessa e devi imparare ad usarla. Tu stai applicando lo stesso principio ad un oggetto di tipo mela con un oggetto di tipo tavola. Quindi sono due cose totalmente differenti. il char è il tipo standard del ansi C, lo std::string è una classe (ribadisco classe) delle template standard. Non centra per niente il puntatore nella classe string ma i vari funzioni e gli overload che questa classe permette. Quindi se tu puoi fare
std::string x;
x = "prova";
in realtà ciò che stai facendo è:
creare una classe std::string di nome x;
mettere in questa stringa dei caratteri con l'istruzione x = "prova";
(qui entra in gioco l'overload dell'operatore = della classe string)
come vengono inseriti questi caratteri:
internamente la classe string calcola lo spazio necessario a contenere i caratteri, chiede al sistema lo spazio necessario, copia internamente i caratteri. Quindi non c'è una modifica di puntatore ma una cosa molto diversa come vedi.
Nel secondo esempio
char * x=new char;
x="prova";
qui x è un puntatore a char e quindi può contenere solo un indirizzo dove risiede un carattere.
x = "prova";
A x li viene assegnato l'indirizzo dove sta il carattere 'p' nell'array di caratteri "prova" questo perche l'indirizzo di 'p' equivale all'indirizzo del primo carattere dell'array di caratteri "prova"
Terzo esempio
char * x=new char;
*x="prova";
*x in questo caso è un carattere perche x è un puntatore a char, forse questo passaggio a te non ti è chiaro.
Non puoi assegnare a un carattere un array intero di caratteri, da cui l'errore.