web-dev-qa-db-ja.com

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

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

#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スタイルの文字列リテラルです。

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

9
Aditya Prakash

これは、次の 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のコメントを盗む:

「完全を期すために、このオーバーロードが存在しなかった場合でも比較は機能します。コンパイラーは、Cスタイルの文字列からstd::string型の一時オブジェクトを構築し、 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)

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

16
JeJo