web-dev-qa-db-fra.com

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

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? s1 est un objet tandis que "Apple" est un chaîne de style C littéral.

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

9
Aditya Prakash

C'est à cause des éléments suivants opérateur de comparaison défini pour std::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::string et le const char*. Ainsi la magie!


Voler le @ Pete Becker 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 de la chaîne de style C et comparez les deux std::string objets, 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 (c'est-à-dire 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. "

16
JeJo