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는 한 유형이 다른 유형으로 변환 될 수있는 한 일반적으로이를 비교할 수 있습니다. std::stringc- 문자열에서 a를 초기화 할 수 있습니다 .
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 의 의견 훔치기 :

"완전성을 위해이 오버로드가 존재하지 않으면 비교는 여전히 작동합니다. 컴파일러는 C 스타일 문자열std::string 에서 유형의 임시 오브젝트를 구성 하고 첫 번째 오버로드를 사용하여 두 오브젝트를 비교합니다. std::stringoperator==

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 객체 유형의 임시 객체를 구성 합니다. 이것이이 연산자가 존재하는 이유입니다. 즉, 임시 개체가 필요하지 않으며 개체를 만들고 삭제하는 데 드는 오버 헤드가 없습니다.
Pete Becker

1
@PeteBecker 물론 대답에 추가했습니다. 지적 해 주셔서 감사합니다!
JeJo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.