Comparando literais std :: string e string no estilo C

9

Suponha que eu tenha o seguinte código:

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

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

Minha pergunta é: como o sistema verifica entre esses dois? s1é um objeto enquanto "Apple"é uma literal de seqüência de caracteres do estilo C.

Tanto quanto sei, diferentes tipos de dados não podem ser comparados. O que estou perdendo aqui?

Aditya Prakash
fonte
6
basic_string / operator_cmp ((7) no seu caso).
Jarod42
2
Fwiw, desde que um tipo possa ser convertido para outro, geralmente você pode compará-los. Você pode inicializar a std::stringpartir de uma c-string.
NathanOliver 26/12/19

Respostas:

16

É por causa do seguinte operador de comparação definido parastd::string

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

Isso permite a comparação entre std::stringe o const char*. Assim a mágica!


Roubando o comentário de @Pete Becker :

"Para completar, se essa sobrecarga não existisse, a comparação ainda funcionaria; o compilador construiria um objeto temporário do tipo a std::stringpartir da string no estilo C e compararia os dois std::stringobjetos, usando a primeira sobrecarga 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)

É por isso que esse operador (ou seja, a sobrecarga 7 ) existe: elimina a necessidade desse objeto temporário e a sobrecarga envolvida na criação e destruição dele ".

JeJo
fonte
8
E, para completar, se essa sobrecarga não existisse, a comparação ainda funcionaria; o compilador construiria um objeto temporário do tipo std::string from the C-style string and compare the two std :: string objects. É por isso que esse operador está lá: elimina a necessidade desse objeto temporário e a sobrecarga envolvida na criação e destruição dele.
Pete Becker
11
@PeteBecker Claro, eu adicionei à resposta. Obrigado por apontar!
JeJo 27/12/19