In Copy initialization an object is initialized by another object..
The following circumstances necessitate copy initialization:
1) When a named variable of non-reference type T is defined with an initializer that consists of an equals sign and an expression (automatic, static, or thread-local).
2) (up until C++11) when a named variable of the scalar type T is defined with an initializer that consists of an equals sign followed by an expression surrounded in braces (Note: as of C++11, this is categorized as list initialization, and narrowing conversion is not permitted).
3) When calling a function that returns by value.
4) giving an argument by value.
3) When calling a function that returns by value.
6) As part of aggregate initialization, to initialize each element for which an initializer is provided.
6) As part of aggregate initialization, to initialize each element for which an initializer is provided.