I frequently come across POD structs in code that are manually zero-initialized with memset
like so:
struct foo;
memset(&foo, 0, sizeof(foo));
I checked the C++11 standard and it says: "An object whose initializer is an empty set of parentheses, i.e., (), shall be value-initialized." Followed by: "To value-initialize a [pod struct] of type T means ... the object is zero-initialized."
So... does this mean you can always safely condense the above code to just the following:
struct foo{};
And have a guaranteed initialized struct as if you had called memset(&foo, 0, ...)
?
If so, then generally speaking, can you safely initialize anything with empty initializers like so:
SomeUnknownType foo{}; // will 'foo' be completely "set" to known values?
I know this wasn't always possible in C++03 (before uniform initialization syntax) but is it possible now in C++11 for any type?
You can certainly initialize any standard layout type using empty parenthesis and get it zero initialized. Once you add constructors into the picture, this isn't necessarily true, unfortunately:
While
f.f
is zero initialized,b.b
is uninitialized. However, there isn't anything you can do aboutbar
because you can'tmemset()
it either. It needs to be fixed.