Các mã sau biên dịch và thực thi mà không có lỗi mặc dù không có nhà điều hành bình đẳng được xác định:chuyển đổi ngầm của cả hai toán hạng cho toán tử ==
class A {
public:
operator bool() const { return true; }
};
int main()
{
A a, b;
a == b; //why does this compile?
return 0;
}
gì sẽ xảy ra trong nội bộ cho a == b
là operator bool() const
được gọi là cho cả toán hạng, và sau đó hai boolean được so sánh cho bình đẳng (điều này xảy ra trong mã sản xuất của chúng tôi, nơi class A
là một kiểu con trỏ thông minh, và đưa ra kết quả không rõ ràng về ngữ nghĩa).
Câu hỏi của tôi là: Quy tắc nào trong tiêu chuẩn C++ cho phép chuyển đổi ẩn của cả hai toán hạng trong trường hợp này? Tôi có thể hiểu rằng một toán hạng sẽ được chuyển đổi hoàn toàn thành bool
để kiểm tra tính bình đẳng nếu toán hạng khác đã là bool
, nhưng không phải cả hai.
Điều gì khiến bạn hiểu điều đó? Bạn đã bao giờ làm theo hướng dẫn để thêm 'operator ==' vào một lớp chưa? Nó được đề nghị để làm cho nó một chức năng miễn phí của người bạn chấp nhận hai đối tượng lớp bằng một tham chiếu const. Điều này là chính xác để cho phép chuyển đổi loại ngầm định của ** cả hai toán hạng **. – StoryTeller
xem xét thẻ [ngôn ngữ-luật sư]? Tôi nghĩ rằng nó rất có liên quan ở đây – quetzalcoatl
@StoryTeller Bạn có thể giải thích cùng một lý do để có nghĩa là nó cho phép chuyển đổi ** hoặc toán hạng **, và không nhất thiết phải mong đợi nó sẽ áp dụng cho cả hai cùng một lúc. Và nếu bạn đã không hoàn toàn có đầu của bạn xung quanh tra cứu bình thường và ADL, tôi có thể thấy lý do tại sao bạn sẽ mong đợi điều đó. – BoBTFish