Giả sử tôi có một loại và tôi muốn đặt hàm tạo mặc định của nó là riêng tư. Tôi viết như sau:Khi nào một nhà xây dựng tư nhân không phải là một nhà xây dựng tư nhân?
class C {
C() = default;
};
int main() {
C c; // error: C::C() is private within this context (g++)
// error: calling a private constructor of class 'C' (clang++)
// error C2248: 'C::C' cannot access private member declared in class 'C' (MSVC)
auto c2 = C(); // error: as above
}
Tuyệt vời.
Nhưng sau đó, các nhà xây dựng hóa ra không được riêng tư như tôi nghĩ rằng nó là:
class C {
C() = default;
};
int main() {
C c{}; // OK on all compilers
auto c2 = C{}; // OK on all compilers
}
này đập vào mắt tôi là rất đáng ngạc nhiên, bất ngờ, và hành vi rõ ràng không mong muốn. Tại sao điều này OK?
Không phải là 'C c {}; 'khởi tạo tổng hợp sao cho không có hàm tạo nào được gọi? – NathanOliver
Điều gì @NathanOliver nói. Bạn không có một hàm tạo do người dùng cung cấp, vì vậy 'C' là tổng hợp. –
@KerrekSB Đồng thời, tôi khá ngạc nhiên khi người dùng khai báo một ctor một cách rõ ràng không làm cho ctor do người dùng cung cấp. – Angew