2010-05-20 32 views
5

Bản nháp làm việc gọi rõ ràng rằng các hàm mặc định phải là các hàm thành viên đặc biệt (ví dụ: hàm sao chép, hàm tạo mặc định, vv, (§8.4.2.1-1)). Mà làm cho cảm giác hoàn hảo.Có thể chức năng nào bị xóa không?

Tuy nhiên, tôi không thấy bất kỳ hạn chế nào như vậy trên các chức năng đã xóa (§8.4.3). Có đúng không?

Hay nói cách khác là ba ví dụ này hợp lệ c++0?

struct Foo 
{ 
    // 1 
    int bar(int) = delete; 
}; 


// 2 
int baz(int) = delete; 


template< typename T > 
int boo(T t); 

// 3 
template<> 
int boo<int>(int t) = delete; 
+1

Chức năng bị xóa là gì? – Puppy

+1

Chức năng đã xóa là một chức năng đã tồn tại nếu nó chưa bị xóa. Ví dụ. bạn có thể xóa ctor sao chép lớp. Điều này là hơi cao hơn để làm cho nó tư nhân unimplemented, vì hai lý do. 1. nó rõ ràng hơn khi đọc mã và 2. bạn có thể nhận được một thông báo lỗi rõ ràng hơn. – MSalters

+2

@MSalters: Bạn cũng có thể xóa các chức năng không tồn tại, ngăn chặn việc sử dụng chúng. Ví dụ. cho 'void f (double); void f (int) = delete; ', f (42) bây giờ là một lỗi thay vì sử dụng chuyển đổi ngầm định. –

Trả lời

4

Thông số C++ 0x (§ [dcl.fct.def.delete]) không từ chối các cấu trúc như vậy và g ++ 4.5 nhận dạng tất cả 3 trong số chúng.

x.cpp: In function 'int main()': 
x.cpp:4:8: error: deleted function 'int Foo::bar(int)' 
x.cpp:21:11: error: used here 
x.cpp:9:5: error: deleted function 'int baz(int)' 
x.cpp:22:2: error: used here 
x.cpp:9:5: error: deleted function 'int baz(int)' 
x.cpp:22:8: error: used here 
x.cpp:17:5: error: deleted function 'int boo(T) [with T = int]' 
x.cpp:23:7: error: used here 
-3

Từ những gì tôi hiểu từ định nghĩa của hàm thành viên "đã xóa", là nó chỉ áp dụng cho các hàm thành viên đặc biệt (constructor, sao chép, chuyển nhượng) có thể được tạo ra tự động bởi trình biên dịch và không thành viên bình thường chức năng (mà không có ý nghĩa ở tất cả IMO, để tuyên bố các chức năng được "xóa", do đó, chỉ cần không khai báo chúng anyway)

+1

Nó có thể được sử dụng cho bất kỳ chức năng nào có mặc định. Ví dụ: để vô hiệu hóa quảng cáo. – a1ex07

4

Tôi nghĩ rằng tất cả đều ổn.

= delete là tốt để đảm bảo quá tải không được sử dụng (§8.4.3/2), đây là các lớp học hữu ích bên ngoài.

Bây giờ 5 tháng sau, tôi nhìn vào các câu trả lời khác… delete không chỉ hữu ích cho các hàm có định nghĩa ẩn. Đó là giải pháp thay thế sạch sẽ đối với nhận xét cho biết "không triển khai - sử dụng đây là lỗi liên kết." Nó cung cấp một cách rõ ràng để không thực hiện một cái gì đó, ví dụ như một mẫu cơ bản, nơi chỉ chuyên môn rõ ràng mới thực sự tồn tại. Trình biên dịch sẽ khiếu nại trước thời gian liên kết.

Đối với một ví dụ hơi kỳ quặc, nhưng hoàn toàn hợp lý, hãy xem xét

class abc { 
protected: 
    inline virtual ~abc() = 0; 
    inline virtual void do_something() = 0; 
}; 

abc::~abc() {} 
void abc::do_something = delete; 

Cả = 0= delete có thể được sử dụng trên các chức năng tương tự. Nếu không có = delete, người dùng có thể thực hiện cuộc gọi miễn phí ngẫu nhiên đến abc::do_something().

Tôi sẽ không ngạc nhiên nếu lần lặp tiếp theo của C++ sau C++ 0x thêm các lớp đã xóa một cách rõ ràng.

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