Std :: string ve C-stili string değişmezlerini karşılaştırma


9

Aşağıdaki kod var:

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

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

Sorum şu: Sistem bu ikisi arasında nasıl kontrol ediyor? s1iken bir nesnedir "Apple"bir olan C tarzı dize değişmezi.

Bildiğim kadarıyla, farklı veri türleri karşılaştırılamaz. Burada ne eksik?


6
basic_string / operator_cmp ((7) sizin durumunuzda).
Jarod42

2
Fwiw, bir tür diğerine dönüştürülebildiği sürece, bunları genellikle karşılaştırabilirsiniz. std::stringBir c-string'den başlatabilirsiniz .
NathanOliver

Yanıtlar:


16

Bunun nedeni aşağıdaki biridir için tanımlanan karşılaştırma operatörüstd::string

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

Bu karşılaştırma arasındaki verir std::stringve const char*. Böylece sihir!


@Pete Becker'ın yorumunu çalmak :

"Tamamlayıcı olmak üzere bu aşırı yük olmasaydı, karşılaştırma hala iş olur; derleyici tip bir geçici nesne inşa edecek std::stringdan C tarzı dizesi ve iki karşılaştırmak std::stringkullanarak, nesneleri ilk aşırı ait 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)

Bu nedenle bu operatör (yani aşırı yük 7 ) oradadır: geçici nesneye olan ihtiyacı ve onu yaratma ve yok etme yükünü ortadan kaldırır. "


8
Ve tamlık için, eğer bu aşırı yüklenme olmasaydı, karşılaştırma yine de işe yarardı; derleyici std::string from the C-style string and compare the two std :: string nesneleri türünde geçici bir nesne oluşturur . Bu nedenle bu operatör oradadır: geçici nesneye olan ihtiyacı ve onu yaratma ve yok etme yükünü ortadan kaldırır.
Pete Becker

1
@PeteBecker Elbette, cevaba ekledim. İşaret ettiğiniz için teşekkürler!
JeJo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.