string s;
bool b[] = {s=="", s==s.c_str(), s.c_str()==""};
imposta
b[] = {true, true, false};
perché è b[2]falso?
Se A==Be A==C, ciò non dovrebbe implicare B==C?
string s;
bool b[] = {s=="", s==s.c_str(), s.c_str()==""};
imposta
b[] = {true, true, false};
perché è b[2]falso?
Se A==Be A==C, ciò non dovrebbe implicare B==C?
Risposte:
In questa espressione
s.c_str()==""
vengono confrontati due puntatori (indirizzi). Il primo è il puntatore restituito da s.c_str()e il secondo è il puntatore al primo carattere (terminando il carattere zero) del valore letterale della stringa "".
È evidente che gli indirizzi sono diversi (tenere presente anche che la stringa letterale ha la durata di memorizzazione statica).
Per ottenere il risultato atteso dovresti invece scrivere
std::strcmp( s.c_str(), "" ) == 0
Per quanto riguarda queste due espressioni
s==""
e
s==s.c_str()
quindi ci sono stringhe confrontate perché la classe standard std :: string ha l'operatore sovraccaricato == per l'operando giusto.