So sánh std :: chuỗi và chuỗi ký tự kiểu C


9

Giả sử tôi có đoạn mã sau:

#include <iostream>
#include <string>
#include <iomanip>
using namespace std; // or std::

int main()
{
    string s1{ "Apple" };
    cout << boolalpha;
    cout << (s1 == "Apple") << endl; //true
}

Câu hỏi của tôi là: Làm thế nào để hệ thống kiểm tra giữa hai? s1là một đối tượng trong khi "Apple"là một C-style chuỗi chữ.

Theo tôi biết, các loại dữ liệu khác nhau không thể được so sánh. Tôi đang thiếu gì ở đây?


6
basic_opes / oper_cmp ((7) trong trường hợp của bạn).
Jarod42

2
Fwiw, miễn là một loại có thể được chuyển đổi sang loại khác, bạn thường có thể so sánh chúng. Bạn có thể khởi tạo a std::stringtừ chuỗi c.
NathanOliver

Câu trả lời:


16

Đó là do toán tử so sánh sau được định nghĩa chostd::string

template< class CharT, class Traits, class Alloc >
bool operator==( const basic_string<CharT,Traits,Alloc>& lhs, const CharT* rhs );  // Overload (7)

Điều này cho phép so sánh giữa std::stringconst char*. Thật là kỳ diệu!


Ăn cắp bình luận của @Pete Becker :

"Để hoàn thiện, nếu quá tải này không tồn tại, phép so sánh vẫn hoạt động; Trình biên dịch sẽ xây dựng một đối tượng tạm thời loại std::stringtừ chuỗi kiểu C và so sánh hai std::stringđối tượng, sử dụng quá tải đầu tiên là 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)

Đó là lý do tại sao toán tử này (tức là quá tải 7 ) có mặt: nó loại bỏ sự cần thiết của đối tượng tạm thời đó và chi phí liên quan đến việc tạo và phá hủy nó. "


8
Và, để hoàn thiện, nếu sự quá tải này không tồn tại, sự so sánh vẫn sẽ hoạt động; trình biên dịch sẽ xây dựng một đối tượng tạm thời của các đối tượng kiểu std::string from the C-style string and compare the two std :: string. Đó là lý do tại sao toán tử này ở đó: nó loại bỏ sự cần thiết của đối tượng tạm thời đó và chi phí liên quan đến việc tạo và phá hủy nó.
Pete Becker

1
@PeteBecker Tất nhiên, tôi đã thêm nó vào câu trả lời. Cảm ơn đã chỉ ra!
JeJo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.