Membandingkan std :: string dan literal string C-style

9

Misalkan saya memiliki kode berikut:

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

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

Pertanyaan saya adalah: Bagaimana sistem memeriksa di antara keduanya? s1adalah obyek sementara "Apple"adalah string yang C-gaya literal.

Sejauh yang saya tahu, tipe data yang berbeda tidak dapat dibandingkan. Apa yang kulewatkan di sini?

Aditya Prakash
sumber
6
basic_string / operator_cmp ((7) dalam kasus Anda).
Jarod42
2
Namun, selama satu jenis dapat dikonversi ke yang lain, Anda biasanya dapat membandingkannya. Anda dapat menginisialisasi a std::stringdari c-string.
NathanOliver

Jawaban:

16

Itu karena berikut operator perbandingan yang ditentukan untukstd::string

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

Ini memungkinkan perbandingan antara std::stringdan const char*. Demikianlah keajaiban!


Mencuri komentar @Pete Becker :

"Untuk kelengkapan, jika kelebihan ini tidak ada, perbandingan akan tetap kerja; Compiler akan membangun objek sementara tipe std::stringdari C-gaya tali dan membandingkan dua std::stringbenda, menggunakan overload pertama 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)

Itulah sebabnya operator ini (yaitu kelebihan 7 ) ada di sana: itu menghilangkan kebutuhan untuk objek sementara dan overhead yang terlibat dalam menciptakan dan menghancurkannya. "

JeJo
sumber
8
Dan, untuk kelengkapan, jika kelebihan ini tidak ada, perbandingan akan tetap berfungsi; kompiler akan membangun objek sementara dari tipe std::string from the C-style string and compare the two std :: string objek Itulah sebabnya operator ini ada di sana: ia menghilangkan kebutuhan akan objek sementara dan overhead yang terlibat dalam menciptakan dan menghancurkannya.
Pete Becker
1
@PeteBecker Tentu saja, saya telah menambahkannya ke jawabannya. Terima kasih telah menunjukkan!
JeJo