次のコードがあるとします。
#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スタイルの文字列リテラルです。
私の知る限り、異なるデータ型を比較することはできません。ここで何が欠けていますか?
これは、次の std::string
に定義された比較演算子のためです
template< class CharT, class Traits, class Alloc >
bool operator==( const basic_string<CharT,Traits,Alloc>& lhs, const CharT* rhs ); // Overload (7)
これにより、std::string
とconst 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)が存在する理由です。これにより、その一時オブジェクトの必要性と、その作成と破棄に伴うオーバーヘッドが排除されます。」