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.