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?
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 deuxstd::string
objets, en utilisant la première surcharge deoperator==
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. "