Vergleichen von std :: string- und C-artigen String-Literalen

9

Angenommen, ich habe den folgenden Code:

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

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

Meine Frage ist: Wie prüft das System zwischen diesen beiden? s1ist ein Objekt, während "Apple"es sich um ein Zeichenfolgenliteral im C-Stil handelt .

Soweit ich weiß, können verschiedene Datentypen nicht verglichen werden. Was fehlt mir hier?

Aditya Prakash
quelle
6
basic_string / operator_cmp ((7) in Ihrem Fall).
Jarod42
2
Fwiw, solange ein Typ in einen anderen konvertiert werden kann, können Sie diese im Allgemeinen vergleichen. Sie können a std::stringaus einem C-String initialisieren .
NathanOliver

Antworten:

16

Dies liegt an dem folgenden Vergleichsoperator, für den definiert wurdestd::string

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

Dies ermöglicht den Vergleich zwischen std::stringund const char*. So die Magie!


Den Kommentar von @Pete Becker stehlen :

"Der Vollständigkeit halber würde der Vergleich immer noch funktionieren, wenn diese Überladung nicht vorhanden wäre. Der Compiler würde ein temporäres Objekt vom Typ std::stringaus der Zeichenfolge im C-Stil erstellen und die beiden std::stringObjekte unter Verwendung der ersten Überladung von vergleichen 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)

Aus diesem Grund ist dieser Operator (dh Überladung 7 ) vorhanden: Er eliminiert die Notwendigkeit für dieses temporäre Objekt und den Aufwand für dessen Erstellung und Zerstörung. "

JeJo
quelle
8
Und der Vollständigkeit halber würde der Vergleich immer noch funktionieren, wenn diese Überlastung nicht vorhanden wäre. Der Compiler würde ein temporäres Objekt vom Typ std::string from the C-style string and compare the two std :: string-Objekte erstellen. Aus diesem Grund ist dieser Operator vorhanden: Er eliminiert die Notwendigkeit für dieses temporäre Objekt und den Aufwand für dessen Erstellung und Zerstörung.
Pete Becker
1
@PeteBecker Natürlich habe ich es der Antwort hinzugefügt. Vielen Dank für den Hinweis!
JeJo