g++
đưa ra một lời giải thích thoải mái trong các lỗi:
bla.cpp:6:5: note: ‘D::D()’ is implicitly deleted because the default definition would be ill-formed: D() = default;
Các constructor mặc định sẽ cố gắng để xây dựng tất cả các bộ phận của D
. Bạn không có trường nào, nhưng nó có một số B
ban đầu - không có một hàm tạo trống nào, chỉ có một trường là int
.
Hành vi mặc định có ý nghĩa - D
không được có hàm tạo trống, trừ khi nó nêu rõ int
để xây dựng B
và trình biên dịch không muốn đoán. Nếu không, bạn sẽ có một đối tượng D
, và tùy thuộc vào những gì xảy ra trong B
constructor B
có thể chứa rác, ví dụ nếu khởi tạo một lĩnh vực.
Tôi không chắc chắn nếu bạn có nghĩa là câu hỏi của bạn theo nghĩa đen khi bạn hỏi tại sao điều này "phép", như các nhà xây dựng B
mặc định sẽ bị xóa, nhưng tôi có thể nghĩ đến hai lý do:
- này hành vi được xác định rõ, và không có lý do gì để không cho phép nó. Phát hiện lỗi chỉ khi bạn cố gắng xây dựng một cái gì đó bất hợp pháp được thực hiện anyway.
- Đó là linh hoạt hơn - thay đổi
B
để có một constructor mặc định sẽ tự động cho phép D
để có một.
Nếu bạn thay đổi B, D sẽ tự động làm điều đúng. –
Bạn đang sử dụng trình biên dịch nào?Có thể đó là vì cấu trúc của bạn trống và không làm gì, do đó trình biên dịch bỏ qua nó hoàn toàn như được định nghĩa với '= default'? –
g ++ 5.1.0 'lưu ý: 'D :: D()' bị xóa hoàn toàn vì định nghĩa mặc định sẽ bị lỗi:' và 'lỗi: không có hàm nào phù hợp để gọi 'B :: B()'' –