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

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

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

Адитья Пракаш
источник
6
basic_string / operator_cmp ((7) в вашем случае).
Jarod42
2
Кстати, если один тип может быть преобразован в другой, вы можете сравнить их. Вы можете инициализировать std::stringиз c-строки.
Натан Оливер

Ответы:

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::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)

Вот почему этот оператор (т. Е. Перегрузка 7 ) присутствует: он устраняет необходимость в этом временном объекте и накладные расходы, связанные с его созданием и уничтожением ».

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