std :: stringとCスタイルの文字列リテラルの比較


9

次のコードがあるとします。

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

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

私の質問は次のとおりです。システムはどのようにこれら2つをチェックしますか?s1はオブジェクト"Apple"ですが、Cスタイルの文字列リテラルです。

私の知る限り、異なるデータ型を比較す​​ることはできません。ここで何が欠けていますか?


6
basic_string / operator_cmp(あなたの場合(7))。
Jarod42

2
Fwiw、あるタイプを別のタイプに変換できる限り、通常はそれらを比較できます。std::stringc文字列からa を初期化できます。
NathanOliver

回答:


16

これは、次の比較演算子が定義されているためですstd::string

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

これは間の比較ができますstd::stringconst char*。したがって、魔法!


@Pete Beckerのコメントを盗む:

「完全を期すため、このオーバーロードが存在しなくても比較は機能します。コンパイラはstd::stringCスタイルの文字列から型の一時オブジェクトをstd::string作成し、最初のオーバーロードを使用し 2つのオブジェクトを比較し ます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)

これが、この演算子(つまり、オーバーロード7)が存在する理由です。これにより、一時オブジェクトの必要性と、その作成と破棄に伴うオーバーヘッドが排除されます。」


8
そして、完全を期すために、このオーバーロードが存在しない場合でも、比較は機能します。コンパイラーは、タイプstd::string from the C-style string and compare the two std :: stringオブジェクトの一時オブジェクトを構成します。これが、この演算子が存在する理由です。これにより、その一時オブジェクトの必要性と、その作成と破棄に伴うオーバーヘッドがなくなります。
ピートベッカー

1
@PeteBeckerもちろん、私はそれを答えに加えました。指摘してくれてありがとう!
JeJo、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.