Default-initialization

This is the initialization performed when an object is constructed with no initializer.

# Notes

References and const scalar objects cannot be default-initialized.

# Example

#include <string>
 
struct T1 { int mem; };
 
struct T2
{
    int mem;
    T2() {} // “mem” is not in the initializer list
};
 
int n; // static non-class, a two-phase initialization is done:
       // 1) zero-initialization initializes n to zero
       // 2) default-initialization does nothing, leaving n being zero
 
int main()
{
    [[maybe_unused]]
    int n;            // non-class, the value is indeterminate
    std::string s;    // class, calls default constructor, the value is ""
    std::string a[2]; // array, default-initializes the elements, the value is {"", ""}
//  int& r;           // Error: a reference
//  const int n;      // Error: a const non-class
//  const T1 t1;      // Error: const class with implicit default constructor
    [[maybe_unused]]
    T1 t1;            // class, calls implicit default constructor
    const T2 t2;      // const class, calls the user-provided default constructor
                      // t2.mem is default-initialized
}

# Defect reports

DRApplied toBehavior as publishedCorrect behavior
CWG 178C++98there was no value-initialization;empty initializer invoked default-initialization(though new T() also performs zero-initialization)empty initializer invokesvalue-initialization
CWG 253C++98default-initialization of a const object could notcall an implicitly declared default constructorallowed if all subobjects are initialized
CWG 616C++98lvalue to rvalue conversion of anyuninitialized object was always UBindeterminate unsigned char is allowed
CWG 1787C++98read from an indeterminate unsigned charcached in a register was UBmade well-defined

# See also