Confronto tra i letterali std :: string e stringhe in stile C.


9

Supponiamo che io abbia il seguente codice:

#include <iostream>
#include <string>
#include <iomanip>
using namespace std; // or std::

int main()
{
    string s1{ "Apple" };
    cout << boolalpha;
    cout << (s1 == "Apple") << endl; //true
}

La mia domanda è: come verifica il sistema tra questi due? s1è un oggetto mentre "Apple"è letterale una stringa in stile C.

Per quanto ne so, non è possibile confrontare diversi tipi di dati. Cosa mi sto perdendo qui?


6
basic_string / operator_cmp ((7) nel tuo caso).
Jarod42,

2
In seguito, fintanto che un tipo può essere convertito in un altro, puoi generalmente confrontarli. È possibile inizializzare un std::stringda una stringa c.
NathanOliver, il

Risposte:


16

È a causa del seguente operatore di confronto definito perstd::string

template< class CharT, class Traits, class Alloc >
bool operator==( const basic_string<CharT,Traits,Alloc>& lhs, const CharT* rhs );  // Overload (7)

Ciò consente il confronto tra std::stringe il const char*. Quindi la magia!


Rubare il commento di @Pete Becker :

"Per completezza, se questo sovraccarico non esistesse, il confronto continuerebbe a funzionare; il compilatore dovrebbe costruire un oggetto temporaneo di tipo std::stringdalla stringa in stile C e confrontare i due std::stringoggetti, usando il primo sovraccarico di operator==

template< class CharT, class Traits, class Alloc >
bool operator==( const basic_string<CharT,Traits,Alloc>& lhs,
                 const basic_string<CharT,Traits,Alloc>& rhs );   // Overload (1)

Questo è il motivo per cui questo operatore (ovvero il sovraccarico 7 ) è lì: elimina la necessità di quell'oggetto temporaneo e il sovraccarico coinvolto nella creazione e nella distruzione. "


8
E, per completezza, se questo sovraccarico non esistesse, il confronto funzionerebbe comunque; il compilatore costruirà un oggetto temporaneo di tipo std::string from the C-style string and compare the two std :: string object. Questo è il motivo per cui questo operatore è lì: elimina la necessità di quell'oggetto temporaneo e il sovraccarico coinvolto nella sua creazione e distruzione.
Pete Becker,

1
@PeteBecker Naturalmente, l'ho aggiunto alla risposta. Grazie per la segnalazione!
JeJo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.