2014-09-08 14 views
19

sau Mã C++ 11 biên dịch thành công trên GCC của tôi 4.8:C++ 11 tin constructor mặc định

struct NonStack 
{ 
private: 
    NonStack() = default; 
public: 
    static NonStack* Create(){ 
    return new NonStack; 
    } 
}; 
NonStack a; 

int main() { } 

Tuy nhiên sau đây đưa ra một lỗi biên dịch:

struct NonStack 
{ 
private: 
    NonStack(){} 
}; 

NonStack a; 

int main() { } 

Tại sao đầu tiên một thành công? Không nên xây dựng mặc định tư nhân cấm tạo một đối tượng thông qua NonStack a;?

+2

Mã của bạn thực sự [biên dịch] (http://coliru.stacked-crooked.com/a/55199811d96f1af7) trên gcc4.8, nhưng 4.9 từ chối nó (như nó phải). – Praetorian

+8

Câu hỏi này sẽ tốt hơn nếu có câu hỏi trong đó. –

+0

Bạn cũng có thể '= xóa;' hàm tạo. Nó sẽ hoạt động như mong đợi. – glampert

Trả lời

17

Đây là lỗi gcc 54812, trình biên dịch không tôn trọng các chỉ định truy cập cho các hàm thành viên đặc biệt mặc định rõ ràng. Bug 56429, được đánh dấu là bản sao của phiên bản cũ hơn, có một trường hợp thử nghiệm gần giống với ví dụ trong câu hỏi.

Các giải pháp là nâng cấp lên gcc4.9, giải quyết vấn đề. Hoặc tạo một cơ thể trống cho hàm tạo, thay vì mặc định rõ ràng nó, như bạn đã làm trong ví dụ thứ hai.

+3

Lưu ý: lỗi liên kết tới [vấn đề ngôn ngữ cốt lõi 1507] (http: //www.open- std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1507). Nó không phải là một lỗi trong GCC. Các tiêu chuẩn thực sự đã sử dụng để nói rằng kể từ khi constructor là tầm thường, constructor đã không được gọi, và nếu constructor không được gọi, thực tế là nó 'private' không phải là một vấn đề. – hvd

+0

@hvd Đồng ý rằng nhà xây dựng tầm thường tư nhân không thể tiếp cận được nhưng được hình thành tốt là lỗi trong tiêu chuẩn, nhưng báo cáo lỗi gcc vẫn cho biết lỗi vì họ đang áp dụng logic đó cho các trình phá hủy tầm thường không thể tiếp cận. Câu trả lời có thể được nói tốt hơn mặc dù, và tôi sẽ cập nhật nó trong một thời gian ngắn. – Praetorian

+0

Ah đúng, tôi đã bỏ lỡ điều đó, tiêu chuẩn đã có từ ngữ thích hợp cho điều đó lâu hơn. Có lẽ quan tâm, tiêu chuẩn vẫn dường như không có lệnh cấm 'xóa' một con trỏ tới một kiểu lớp không đầy đủ mà sẽ có một destructor tầm thường không thể tiếp cận, nó chỉ là hành vi không xác định nếu destructor thực sự là không tầm thường. – hvd

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