Tôi không biết những gì các lý do cơ bản xung quanh thay đổi (hoặc làm thế nào tiêu chuẩn trước kia), nhưng về cách nó là, về cơ bản mặc định-khởi là một trong hai cách gọi một người sử dụng constructor xác định hoặc không làm gì cả (nhiều vẫy tay ở đây: đây là đệ quy được áp dụng cho mỗi subobject, có nghĩa là subobjects với một constructor mặc định sẽ được khởi tạo, các subobjects không có constructor do người dùng định nghĩa sẽ được uninitialized).
Điều này được mô tả trong §8.5 Trình khởi tạo và không tầm thường để điều hướng. Các định nghĩa cho zero-khởi, mặc định-khởi và giá trị khởi tạo là đoạn 5:
Để zero-khởi tạo một đối tượng kiểu T có nghĩa là:
- nếu T là một loại vô hướng (3.9), đối tượng được đặt thành giá trị 0 (không) được chuyển thành T;
- nếu T là loại nhóm không phải là công đoàn, mỗi thành viên dữ liệu phi tĩnh và mỗi lớp con cấp cơ sở là zeroinitialized;
- nếu T là loại liên kết, thì tên dữ liệu đầu tiên của đối tượng89) được khởi tạo bằng 0;
- nếu T là một loại mảng, mỗi phần tử không được khởi tạo;
- nếu T là loại tham chiếu, không có khởi tạo nào được thực hiện.
Để mặc định khởi tạo một đối tượng kiểu T có nghĩa là:
- nếu T là một-POD phi kiểu lớp (khoản 9), các nhà xây dựng mặc định cho T được gọi là (và khởi tạo là vô hình thành nếu T không có hàm tạo mặc định có thể truy cập);
- nếu T là một loại mảng, mỗi phần tử được khởi tạo mặc định;
- nếu không, đối tượng không được khởi tạo.
Để giá trị khởi tạo một đối tượng kiểu T có nghĩa là:
- nếu T là một loại lớp (khoản 9) với một constructor do người dùng khai báo (12.1), sau đó các nhà xây dựng mặc định cho T được gọi là (và việc khởi tạo bị hỏng nếu T không có hàm tạo mặc định có thể truy cập được);
- nếu T là loại không kết hợp mà không có người tạo khai báo, thì mọi thành phần dữ liệu không tĩnh và thành phần lớp cơ sở của T được khởi tạo giá trị;
- nếu T là một loại mảng thì mỗi phần tử được khởi tạo giá trị;
- nếu không, đối tượng được zero-khởi
Một chương trình mà các cuộc gọi cho mặc định-khởi tạo hoặc giá trị khởi tạo của một thực thể của kiểu tham chiếu không hoàn chỉnh. Nếu T là loại có đủ điều kiện cv, phiên bản T không đủ tiêu chuẩn của T được sử dụng cho các định nghĩa này về zeroinitialization, khởi tạo mặc định và khởi tạo giá trị.
Phần liên quan của tiêu chuẩn C++ 11 mới là 8.5 ("Khởi tạo") điều khoản 5,6,7. –
Có thể nó cung cấp cho mọi người tùy chọn sử dụng ctor mặc định hay không. Trong phiên bản cũ của C++, các dấu ngoặc thường bị mất khi không có tham số. Vì vậy, việc có các dấu ngoặc trên tùy chọn mới sẽ ảnh hưởng đến mã cũ hơn. – QuentinUK
Tôi sẽ không gọi nó là thay đổi, mà là thay đổi. Nó ít nhất cũng có ý nghĩa trong bối cảnh của ví dụ std :: map nơi các giá trị được tạo bởi [] là giá trị được intialized, vì vậy ví dụ: std :: map tất cả U * được initlaized đến 0 –
PlasmaHH