Porównywanie literałów std :: string i literowych w stylu C.

9

Załóżmy, że mam następujący kod:

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

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

Moje pytanie brzmi: w jaki sposób system sprawdza między tymi dwoma? s1jest obiektem, podczas gdy "Apple"jest literałem ciągowym w stylu C.

O ile mi wiadomo, nie można porównywać różnych typów danych. Czego tu brakuje?

Aditya Prakash
źródło
6
basic_string / operator_cmp ((7) w twoim przypadku).
Jarod42,
2
Fwiw, o ile jeden typ można przekonwertować na inny, ogólnie można je porównać. Możesz zainicjować a std::stringz ciągu c.
NathanOliver,

Odpowiedzi:

16

Jest tak z powodu zdefiniowania następującego operatora porównaniastd::string

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

Pozwala to na porównanie między std::stringi const char*. Zatem magia!


Kradzież komentarza @Pete Becker :

„Dla kompletności, gdyby to przeciążenie nie istniało, porównanie nadal działałoby; kompilator skonstruowałby tymczasowy obiekt typu std::stringz łańcucha w stylu C i porównał dwa std::stringobiekty, używając pierwszego przeciążenia 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)

Właśnie dlatego ten operator (tj. Przeciążenie 7 ) istnieje: eliminuje potrzebę tego tymczasowego obiektu i koszty związane z jego tworzeniem i niszczeniem. ”

JeJo
źródło
8
I dla kompletności, gdyby to przeciążenie nie istniało, porównanie nadal działałoby; kompilator zbuduje tymczasowy obiekt typu std::string from the C-style string and compare the two std :: string. Właśnie dlatego ten operator istnieje: eliminuje potrzebę tego tymczasowego obiektu i koszty związane z jego tworzeniem i niszczeniem.
Pete Becker,
1
@PeteBecker Oczywiście dodałem go do odpowiedzi. Dzięki za wskazanie!
JeJo