比较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字符串初始化a 。
NathanOliver

Answers:


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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.