Comparación de literales std :: string y C-style string


9

Supongamos que tengo el siguiente 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
}

Mi pregunta es: ¿Cómo verifica el sistema entre estos dos? s1es un objeto mientras que "Apple"es un literal de cadena de estilo C.

Que yo sepa, no se pueden comparar diferentes tipos de datos. ¿Que me estoy perdiendo aqui?


66

2
Fwiw, siempre que un tipo se pueda convertir a otro, generalmente puede compararlos. Puede inicializar a std::stringdesde una cadena c.
NathanOliver

Respuestas:


16

Se debe al siguiente operador de comparación definido parastd::string

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

Esto permite la comparación entre std::stringy el const char*. ¡Así la magia!


Robando el comentario de @Pete Becker :

"Para completar, si esta sobrecarga no existiera, la comparación seguiría funcionando; el compilador construiría un objeto de tipo temporal a std::stringpartir de la cadena de estilo C y compararía los dos std::stringobjetos, utilizando la primera 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)

Es por eso que este operador (es decir, sobrecarga 7 ) está ahí: elimina la necesidad de ese objeto temporal y la sobrecarga involucrada en crearlo y destruirlo ".


8
Y, para completar, si esta sobrecarga no existiera, la comparación aún funcionaría; el compilador construiría un objeto temporal de tipo std::string from the C-style string and compare the two std :: string objects. Es por eso que este operador está ahí: elimina la necesidad de ese objeto temporal y la sobrecarga involucrada en crearlo y destruirlo.
Pete Becker

1
@PeteBecker Por supuesto, lo he agregado a la respuesta. Gracias por señalar!
JeJo
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.