2010-10-14 31 views
21

Có 4 toán tử trong C++ có thể bị quá tải nhưng không thể bị quá tải như các hàm freestanding (aka nonmember, standalone). Những nhà khai thác là:Lý do thực thi một số toán tử là thành viên

  • operator =
  • operator()
  • operator ->
  • operator []

This thread giải thích rất rõ lý do đằng sau việc cấm operator = là một hàm thành viên. Có ý kiến ​​nào về ba người kia không?

+3

Tôi khá chắc chắn '-> *' có thể được thực hiện như một hàm thành viên. –

+2

@James: Bạn đã đúng. @Armen: Có lẽ chỉ là tầm nhìn ngắn. – GManNickG

+0

@James. Cuốn sách C + + trong một nutshell nói khác ... –

Trả lời

18

Bốn nhà khai thác đề cập trong bài đăng ban đầu, =, (), ->[], thực sự phải được thực hiện như chức năng thành viên không tĩnh (bằng cách lần lượt là C++ 98 §13.5.3/1, §13.5.4/1, §13.5.5/1 và §13.5.6/1).

Lý do của Bjarne Stroustrup, như tôi nhớ lại từ các cuộc tranh luận trước đó về chủ đề, để giữ lại một số sự tỉnh táo trong ngôn ngữ, tức là có ít nhất một số thứ bạn có thể tin cậy. các toán tử thành viên cho các lớp hiện có.

Tôi không chắc chắn rằng tôi hoàn toàn đồng ý rằng hạn chế thực sự hữu ích với điều đó, nhưng.

EDIT: Tôi đã tham khảo ý kiến ​​Bjarne Stroustrup về điều này (anh ấy luôn hữu ích) nhưng dường như sự mâu thuẫn rõ ràng của quy tắc không nhiều hơn trường hợp tai nạn lịch sử đông lạnh. Ông lưu ý rằng "Bây giờ nó trông tệ hơn bây giờ bởi vì quy tắc của chúng tôi về giá trị và tham chiếu đã thay đổi kể từ khi các quy tắc quá tải được xây dựng. Tôi đã cố gắng xem xét vấn đề này một lần nữa vài năm trước, nhưng đã hết thời gian trước khi sản xuất đề xuất hoàn chỉnh. "

Cheers & hth,

PS:. "Các thiết kế và Sự phát triển của C++" Cuốn sách là rất tốt cho các loại hình câu hỏi, nhưng tiếc là tôi không có nó.

+0

Và những gì chính xác trong trường hợp này là sự khác biệt chính giữa -> và -> *? Tại sao người ta không thể là một người không phải là người trong khi người kia có thể? Tôi bằng cách mở cửa cho các câu trả lời như "không có lý do nghiêm trọng. Đó là vô lý, nhưng đó là cách nó là", mặc dù tôi chắc chắn sẽ thất vọng nếu đó là trường hợp –

+0

@Armen: câu hỏi hay. Tôi không biết. Có lẽ điều này được giải thích là "Thiết kế và tiến hóa", và nếu có, có lẽ một người nào đó có cuốn sách đó sẽ kêu vang. Tôi đã kiểm tra trong chiếc ARM cũ, dường như nó không bàn đến nó. –

+0

Lý do cơ bản cho '=' thực sự được trình bày trong D & E và nó có giá trị cho đến ngày nay. Tôi không biết tại sao hạn chế này cũng được áp đặt trên '()', '[]', và '->' mặc dù. – AnT

2

Điều này thread trên comp.std.C++ thảo luận câu hỏi.

Francis Glassborow, người trong ủy ban, nói:

Các nhà thiết kế ngôn ngữ không muốn hỗ trợ chuyển đổi và chương trình khuyến mãi trên các toán hạng trái của toán tử =, cũng không phải như vậy trên toán hạng của() và [].

Đang cố gắng để tránh những tình huống mà:

class A {}; 

class B { B(A& a) {} }; 

int operator()(B const& b) { return 0; } 


int main(void) 
{ 
    A a; 

    // This works even though A doesn't have a() operator 
    // It creates a temporary B and calls operator()(B& b) 
    return a();     
} 
+3

Nit: bạn cần 'int operator() (B const & b)' để tránh cố gắng liên kết tạm thời với tham chiếu tới 'nonst'. Dù sao, câu hỏi của Armen về '-> *' vẫn đứng vững. –

+2

"Nhà thiết kế ngôn ngữ không muốn hỗ trợ chuyển đổi và quảng cáo trên toán hạng bên trái của()". Tuy nhiên, họ cho phép khi một lớp khai báo hàm chuyển đổi thành hàm trỏ đến ... –

+0

@Alf Cảm ơn - đã sửa đổi. – Dingo

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