Сравнение 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
}

Мой вопрос: как система проверяет между этими двумя? s1 — это объект, а "Apple"строковый литерал в стиле C.

Насколько я знаю, разные типы данных нельзя сравнивать. Что мне здесь не хватает?


person Aditya Prakash    schedule 26.12.2019    source источник
comment
basic_string/operator_cmp ((7) в вашем случае).   -  person Jarod42    schedule 26.12.2019
comment
Fwiw, пока один тип может быть преобразован в другой, вы обычно можете сравнивать их. Вы можете инициализировать std::string из c-строки.   -  person NathanOliver    schedule 26.12.2019


Ответы (1)


Это связано со следующим оператором сравнения, определенным для 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:

"Для полноты, если бы этой перегрузки не существовало, сравнение все равно работало бы; компилятор создал бы временный объект типа std::string из строки в стиле C и сравнил бы два объекта std::string, используя первая перегрузка 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) существует: он устраняет необходимость в этом временном объекте и накладных расходах, связанных с его созданием и уничтожением».

person JeJo    schedule 26.12.2019
comment
И, для полноты, если бы этой перегрузки не существовало, сравнение все равно работало бы; компилятор создаст временный объект типа std::string from the C-style string and compare the two std::string objects. Вот почему этот оператор существует: он устраняет необходимость в этом временном объекте и накладных расходах, связанных с его созданием и уничтожением. - person Pete Becker; 27.12.2019
comment
@PeteBecker Конечно, я добавил это в ответ. Спасибо, что указали! - person JeJo; 27.12.2019