2013-05-20 27 views
32

Nếu tôi có một người dùng định nghĩa operator+() như trong:Lỗi kêu gọi người dùng định nghĩa toán tử + trên đối tượng tạm thời khi có dấu ngoặc thêm

class A 
    { 
    public: 
     A operator+(A) 
     { 
      return A(); 
     } 
    }; 

Sau đó, các công việc sau như mong đợi:

A a = A() + A(); 

nhưng g ++ - 4.7 đưa ra thông báo lỗi về các điều sau:

A a = (A()) + A(); 

Thông báo lỗi cụ thể là error: no match for ‘operator+’ in ‘+A()’.
Có vẻ như (A()) đang bị bỏ qua trong biểu thức.

Câu hỏi của tôi là: là A a = (A()) + A(); phải biên dịch và nếu không, tại sao lại không?

Lưu ý: điều này đã xảy ra với tôi khi tôi thực hiện #define X (Identity()) và sau đó thử thực hiện X + X.

+0

Thú vị. Nếu bạn không biết, nó được coi là toán tử cộng đơn, ví dụ: +5. – chris

+0

@chris Bây giờ bạn đề cập đến nó, lỗi này không xảy ra nếu bạn thay đổi ví dụ cho toán tử phép chia, nhưng nó cho các toán tử cộng, trừ và nhân. Có vẻ như nó phân tích các toán tử đơn nhất thay vì các toán tử nhị phân trong trường hợp này. – SirGuy

Trả lời

46

Đó là cú pháp truyền.

Lý do cho điều đó là việc đúc và phép cộng, trừ và phép nhân đơn nhất (toán tử dereference) có độ ưu tiên cao hơn so với đối số nhị phân của chúng. Kể từ khi không gian trắng ở đây không có vấn đề này cũng có thể được đọc như:

A a = (A()) +A(); 

Dàn diễn viên và unary+ có ưu tiên cao hơn nhị phân operator+ nên các biểu hiện mất ý nghĩa cũ.

Bạn có thể tự hỏi (như tôi đã làm) cách bạn có thể truyền khi vật bên trong không phải là một loại. Nhập THE MOST VEXING PARSE!, có nghĩa là tôi đang cố gắng truyền một đối tượng thuộc loại +A() đến một hàm lấy 0 đối số và trả về một đối tượng thuộc loại A.

Đối với hồ sơ, cú pháp:

A a = ((A())) + A(); 

cho những gì bạn muốn từ các dấu ngoặc kép không thể là một diễn viên và chúng tôi trở lại để phân tích các operator+ biểu nhị phân.

Điều này cũng giải thích tại sao vấn đề không xảy ra với toán tử phép chia thay vì bổ sung, nó không có đối tác đơn nhất.

+8

Điều này xứng đáng nhận được nhiều phiếu bầu hơn, trung thực. – chris

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