Порівнюючи 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
Fwiw, якщо один тип можна перетворити на інший, ти можеш взагалі порівняти їх. Ви можете ініціалізувати a std::stringз c-string.
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::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 ) є там: він виключає потребу в цьому тимчасовому об'єкті та накладних витратах, що беруть участь у його створенні та знищенні ".


8
І, для повноти, якби цього перевантаження не існувало, порівняння все-таки спрацювало б; компілятор побудував би тимчасовий об'єкт об'єктів типу std::string from the C-style string and compare the two std :: string. Ось чому цей оператор є там: він виключає потребу в цьому тимчасовому об’єкті та накладних витратах, що беруть участь у його створенні та знищенні.
Піт Бекер

1
@ PeteBecker Звичайно, я додав це у відповідь. Дякуємо, що вказали!
JeJo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.