2017-01-24 17 views
10

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 == boperator 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.

+1

Đ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

+1

xem xét thẻ [ngôn ngữ-luật sư]? Tôi nghĩ rằng nó rất có liên quan ở đây – quetzalcoatl

+0

@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

Trả lời

5

tôi có thể hiểu rằng một toán hạng sẽ được ngầm chuyển đổi ..., nhưng không phải cả hai

Sau đó, bạn đã hiểu lầm. EDIT: Theo các chuyên gia trong ý kiến, đối số phụ thuộc tra cứu dường như là một trường hợp giả định của bạn là chính xác. Nhưng bạn không phải là trường hợp của ADL.

gì quy tắc trong chuẩn C++ cho phép chuyển đổi ngầm của cả hai toán hạng

Từ dự thảo tiêu chuẩn:

[over.match] (2,9)

  • Sau đó, chức năng khả thi tốt nhất được lựa chọn dựa trên các chuỗi chuyển đổi tiềm ẩn (13.3.3.1) cần để khớp với mỗi đối số với thông số tương ứng của mỗi hàm khả thi.

Tôi nhấn mạnh vào "mỗi đối số". Không phải "một đối số".

+0

Đây là khi nhà điều hành được gọi là được tìm thấy trong quá trình tra cứu thông thường, phải không? Nó không thể được tìm thấy thông qua ADL trừ khi một trong các đối số đã giống như kiểu tham số? – BoBTFish

+0

@BoBTFish - đúng. Đó là lý do tại sao 'toán tử ==' cho 'std :: string' sẽ không được sử dụng để so sánh hai con trỏ ký tự thô. – StoryTeller

+0

@StoryTeller Không phải là lý do cho rằng thực tế là có một nhà điều hành được xây dựng, mà không yêu cầu bất kỳ chuyển đổi để nó được ưa thích? – user2079303

Các vấn đề liên quan