Comparaison des littéraux chaîne std :: string et C-style

9

Supposons que j'ai le code suivant:

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

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

Ma question est: comment le système vérifie-t-il entre ces deux? s1est un objet while "Apple"est un littéral de chaîne de style C.

Pour autant que je sache, différents types de données ne peuvent pas être comparés. Qu'est-ce que j'oublie ici?

Aditya Prakash
la source
6
basic_string / operator_cmp ((7) dans votre cas).
Jarod42
2
Fwiw, tant qu'un type peut être converti en un autre, vous pouvez généralement les comparer. Vous pouvez initialiser un à std::stringpartir d'une chaîne c.
NathanOliver

Réponses:

16

C'est à cause de l' opérateur de comparaison suivant défini pourstd::string

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

Cela permet la comparaison entre std::stringet const char*. Ainsi la magie!


Stealing the Becker @Pete commentaire de »:

"Pour être complet, si cette surcharge n'existait pas, la comparaison fonctionnerait toujours. Le compilateur construirait un objet temporaire de type std::string partir de la chaîne de style C et comparerait les deux std::stringobjets, en utilisant la première surcharge de 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)

C'est pourquoi cet opérateur (ie surcharge 7 ) est là: il élimine le besoin de cet objet temporaire et les frais généraux impliqués dans sa création et sa destruction. "

JeJo
la source
8
Et, pour être complet, si cette surcharge n'existait pas, la comparaison fonctionnerait toujours; le compilateur construirait un objet temporaire de type std::string from the C-style string and compare the two objets std :: string. C'est pourquoi cet opérateur est là: il élimine le besoin de cet objet temporaire et les frais généraux impliqués dans sa création et sa destruction.
Pete Becker
1
@PeteBecker Bien sûr, je l'ai ajouté à la réponse. Merci d'avoir souligné!
JeJo