Để bắt đầu, tôi có một cấu trúc với một giá trị với giá trị mặc địnhconst T {}; hoạt động, const T; thất bại khi T là một tổ chức phi POD,
struct S {
int a = 1;
};
loại này có thể được mặc định được xây dựng khi nó là không const/phi constexpr bởi cả gcc và clang. Trong cả hai, std::is_pod<S>::value
là false
. Các hành vi kỳ lạ như sau:
S s1; // works under both
const S s2{}; // works under both
const S s3; // only works in gcc, clang wants a user-provided constructor
Không ai trong số những nỗ lực sau làm cho một sự khác biệt để Clang:
struct S {
int a = 1;
constexpr S() = default; // defaulted ctor
virtual void f() { } // virtual function, not an aggregate
private:
int b = 2; // private member, really not an aggregate
};
Điều duy nhất tôi có thể làm điều đó làm cho công việc này là thêm constexpr S() { }
một cách rõ ràng. Có vẻ như thực sự sai với tôi rằng const S s;
không thành công khi const S s{};
đặc biệt là khi loại không phải là tổng hợp.
Tiêu chuẩn khiến tôi nghĩ rằng Clang là đúng
N4296: 8,5/7
Nếu một chương trình đòi hỏi phải khởi tạo mặc định của một đối tượng của một loại T const-đủ điều kiện, T sẽ là kiểu lớp với một constructor mặc định dùng cung cấp
Vậy tại sao gcc cho phép điều này, và là S{};
không mặc định khởi tạo, ngay cả khi loại không phải là một POD hay một tổng?
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#253; cũng '{}' là khởi tạo giá trị cho các số không tổng hợp. –
Có thể trùng lặp của [Tại sao C++ yêu cầu một hàm tạo mặc định do người dùng cung cấp để mặc định xây dựng một đối tượng const?] (Https://stackoverflow.com/questions/7411515/why-does-c-require-a-user-provided -default-constructor-to-default-construct-a) –
@ David Tôi nghĩ có thêm một chút ở đây với '= default' –