- default initialization ("T var;")
Calls the default constructor (if it exists); otherwise the memory is left uninitialized. - value initialization ("T var = {};")
Calls the default constructor if it exists and is user-defined.
Otherwise, performs zero-initialization and then calls the compiler-generated default constructor (if it exists). - zero initialization
Roughly equivalent to a memset(..., 0, ...)
Code: Select all
struct POD { int member1; int member2; };
class UserDefinedCtor { public: UserDefinedCtor(); };
struct CompilerDefinedCtor { int member1; UserDefinedCtor member2; };
POD pod[3] = {}; // value initialization that uses zero initialization
UserDefinedCtor udc[3] = {}; // value initialization but does not involve zero initialization
CompilerDefinedCtor cdc[3] = {}; // value initialization that involves both zero initialization and constructor calls
What about `udc`? If it is classified as "non-zero initialization", Rule 8-5-2 would require an explicit initializator for each element:
Code: Select all
UserDefinedCtor udc[3] = { UserDefinedCtor(), UserDefinedCtor(), UserDefinedCtor() };