This is not a direct initialization. T a = b; called copying. Direct initialization T a(1, 'foo', false); , and in your constructor you should write the familiar T(int b) : a(b, 'foo', false) { } to achieve this effect, as you did in the first example.
In contrast, T a; called the default initialization, which you achieve by leaving the variable completely unchanged in the list of initializers. Its effect is to call the default constructor for class types and not to initialize the main types at all (for example, for arrays).
Conversely, value initialization can be written as T(int b) : a() { } . You can also use value initialization in new expressions, but they cheat automatic declarations due to annoying parsing.
I think that direct, default, and initialization of values are the only valid forms of initialization in the initialization lists in C ++ 98/03, and C ++ 11 adds different kinds of uniform initialization to the mix.
source share