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?


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. "


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.