Tôi thường xuyên đi qua cấu trúc POD trong mã được bằng tay zero-khởi tạo với memset
như vậy:trong C++ 11, bạn luôn có thể (an toàn) thay thế một khởi tạo memset() bằng một bộ khởi tạo trống không?
struct foo;
memset(&foo, 0, sizeof(foo));
Tôi đã kiểm tra các tiêu chuẩn C++ 11 và nó nói: "Một đối tượng có initializer là một tập rỗng của dấu ngoặc đơn, tức là,(), sẽ được khởi tạo giá trị. "Được theo sau bởi:"Để giá trị khởi tạo [cấu trúc nhóm] của loại T có nghĩa là ... đối tượng không được khởi tạo."
... Vì vậy, điều này có nghĩa là bạn có thể luôn an toàn ngưng tụ mã ở trên để chỉ sau:
struct foo{};
Và có một cấu trúc khởi tạo được bảo đảm, nếu như bạn đã gọi memset(&foo, 0, ...)
?
Nếu vậy, sau đó nói chung, có thể giúp bạn một cách an toàn khởi tạo bất cứ điều gì với initializers trống như vậy:
SomeUnknownType foo{}; // will 'foo' be completely "set" to known values?
Tôi biết điều này không phải luôn luôn có thể trong C++ 03 (trước uniform initialization syntax) nhưng có thể bây giờ trong C++ 11 cho bất kỳ loại nào không?
kiểm tra chủ đề này: http://stackoverflow.com/questions/620137/do-the-parentheses-after-the-type-name-make-a-difference-with-new câu trả lời chung là có. –
Xin lưu ý rằng MSVC chưa bao giờ hỗ trợ khởi tạo giá trị đúng cách và sẽ không thành công trong một số ngữ cảnh. [Microsoft dường như không quan tâm đến việc sửa lỗi] (http://connect.microsoft.com/VisualStudio/feedback/details/484295). – Casey
@Casey: Đó là một lỗi khá nghiêm trọng, tôi tự hỏi nếu nó đã được sửa trong VS mới nhất. May mắn thay, tôi sử dụng gcc và clang (mà dường như quan tâm đến việc tuân thủ các tiêu chuẩn) và mã của tôi không ** phải được chuyển sang các trình biên dịch khác hoặc thậm chí các phiên bản cũ hơn của gcc hoặc clang. – MikeTusar