การเปรียบเทียบ 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-styleและเปรียบเทียบ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 ซึ่งเป็นสาเหตุที่ผู้ปฏิบัติงานรายนี้อยู่ที่นั่น: มันไม่จำเป็นต้องมีวัตถุชั่วคราวและค่าใช้จ่ายที่เกี่ยวข้องในการสร้างและทำลายมัน
Pete Becker

1
@ PetBecker แน่นอนฉันได้เพิ่มไปยังคำตอบ ขอบคุณสำหรับการชี้!
JeJo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.