2009-08-19 39 views
6

Nếu tôi xác định một toán tử gán riêng, trong đó có một chữ ký khác với toán tử gán mặc định thường được tạo ra:Khi nào toán tử gán mặc định C++ trở thành không thể truy cập?

struct B; 
struct A { 
void operator = (const B& b) { 
    // assign something 
} 
}; 

làm toán tử gán mặc định, trong trường hợp này operator = (A&) (hoặc tương tự, chính xác cho tôi nếu sai) trở thành không xác định/không thể truy cập?

AFAIK điều này đúng đối với hàm tạo mặc định, không tồn tại, nếu chúng ta định nghĩa một hàm tạo khác. Nhưng tôi thực sự không chắc chắn nếu điều này là trường hợp cho mặc định "ma thuật" khác.

Lý do tôi hỏi: Tôi muốn tránh rằng trình tạo bản sao mặc định vô tình được gọi qua chuyển đổi loại ngầm định. Nếu nó không tồn tại, nó không bao giờ có thể xảy ra.

Trả lời

12

số 12,8/9 nói rằng toán tử gán cho lớp X phải không tĩnh, không mẫu với một tham số kiểu X, X &, X const &, X dễ bay hơi & hay X const dễ bay hơi &. Và có một lưu ý nhấn mạnh rằng sự khởi tạo của một mẫu không ngăn chặn việc khai báo ngầm định.

+0

Cảm ơn bạn đã tham khảo tiêu chuẩn! Điều đó thực sự nói điều gì đó nhiều hơn các ví dụ của tôi. – xtofl

+0

Bạn nói đúng. Tôi sẽ xóa câu trả lời của tôi. –

+0

@Neil, bạn tự hỏi về việc sử dụng = mặc định có thể là gì. Một là để được rõ ràng trong những gì có sẵn, khác là để thay đổi khả năng tiếp cận một phần ba là nó cho phép thực hiện việc thực hiện không inline trong khi đảm bảo rằng sự tiến hóa của lớp không phá vỡ nó. Một lý do khác là tính năng này rộng hơn phạm vi so với nhiệm vụ và không có động cơ để tạo ngoại lệ ngay cả khi nó không được sử dụng. – AProgrammer

4

A& operator=(B&) không có chữ ký A& operator=(const A&), điều này không có gì đối với toán tử gán tổng hợp.

Hãy xem this snippet at codepad.org - theo như ví dụ được tính là bằng chứng.

Kiểm tra lái xe Comeau với nó cũng cho thấy rằng A& operator=(const A&) được tổng hợp.

+0

Ví dụ rất thú vị. Tôi sẽ làm cho toán tử gán bản sao mặc định riêng tư để chắc chắn. – hirschhornsalz

1

AFAIK điều này đúng với hàm tạo mặc định, không tồn tại, nếu chúng ta định nghĩa một hàm tạo khác. Nhưng tôi thực sự không chắc chắn nếu đây là trường hợp cho các "ma thuật" mặc định khác.

Giá trị mặc định copy constructor sẽ không bị ảnh hưởng bởi việc cung cấp các constructor khác ...

Lý do tôi hỏi: Tôi muốn tránh điều đó constructor sao chép mặc định được vô tình gọi thông qua một loại tiềm ẩn chuyển đổi. Nếu nó không tồn tại, nó không bao giờ có thể xảy ra.

… hoặc toán tử gán. Ví dụ:

class A { 
      private: 
      A& operator= (const A& a); // private here means: forbidden operator 
      public: 
      A(int i) {} 
    }; 

    int main() { 
      A a(2); 
      A b(a);   // copy constructor syntax 1 
      A c = a;  // copy constructor syntax 2 
      // Forbidden: A d; 
      // Forbidden: c = a; 
    } 

Để vô hiệu hóa hàm tạo bản sao mặc định, hãy khai báo (không cần thực hiện, tất nhiên) là riêng tư. Đối với trường hợp sử dụng của bạn, bạn cũng có thể muốn xem từ khóa "rõ ràng" để ngăn chặn chuyển đổi loại tự động.

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