Chỉnh sửa: Tôi đã định dạng lại bài đăng để rõ ràng hơn.Tại sao thêm hai chuỗi ký tự không sử dụng toán tử + (const string &, const string &)?
Tại sao công việc này:
struct A {};
struct B {
B(A){}
};
void operator+(const B&, const B&) {}
int main()
{
A a1, a2;
a1 + a2;
}
và điều này không?
struct B {
B(const char*){}
};
void operator+(const B&, const B&) {} //error: invalid operands of types 'const char [6]' and 'const char [6]' to binary 'operator+'|
int main()
{
"Hello" + "world";
}
Về cơ bản, trong ví dụ đầu tiên a1
và a2
cả chuyển đổi sang B
đối tượng thông qua việc chuyển đổi ngầm và sử dụng operator+(const B&, const B&)
thêm.
Tiếp theo từ ví dụ này, tôi lại có thể ngờ "Hello"
và "world"
chuyển đổi sang B
đối tượng, một lần nữa thông qua các nhà xây dựng ngầm, và sử dụng operator+(const B&, const B&)
để thêm vào nhau. Thay vào đó có lỗi, cho biết các chuỗi kiểu C không cố gắng chuyển đổi do người dùng xác định thành B
để thêm. Tại sao điều này? Có một tài sản cơ bản nào ngăn cản điều này?
Bạn không liên quan đến 'std :: string' với' "ngăn xếp" + "tràn"; '. –
@ πάνταῥεῖ Ông nhận thức được điều đó, câu hỏi đặt ra là tại sao việc chuyển đổi ẩn thành 'std :: string' không khắc phục điều đó cho anh ta. –
Ví dụ tối thiểu của bạn là một chút tắt vì 'const char *' không có toán tử chuyển đổi, nhưng việc chuyển đổi xảy ra thông qua hàm tạo 'std :: string'. [Điều này] (http://coliru.stacked-crooked.com/a/1c4aafeb95886b92) sẽ là một chút apt hơn. –