An object of class type can be initialized with a parenthesized
expression-list,
where the
expression-list
is construed as an argument list for a constructor
that is called to initialize the object.
Either direct-initialization semantics or copy-initialization semantics apply;
see [dcl.init].
[Example 1: struct complex {
complex();
complex(double);
complex(double,double);
};
complex sqrt(complex,complex);
complex a(1); // initialized by calling complex(double) with argument 1
complex b = a; // initialized as a copy of a
complex c = complex(1,2); // initialized by calling complex(double,double) with arguments 1 and 2
complex d = sqrt(b,c); // initialized by calling sqrt(complex,complex) with d as its result object
complex e; // initialized by calling complex()
complex f =3; // initialized by calling complex(double) with argument 3
complex g ={1, 2}; // initialized by calling complex(double, double) with arguments 1 and 2 — end example]
Here,
complex::complex(double)
is called for the initialization of
v[0]
and
v[3],
complex::complex(double, double)
is called for the initialization of
v[1],
complex::complex()
is called for the initialization
v[2],
v[4],
and
v[5].
For another example,
struct X {int i;
float f;
complex c;
} x ={99, 88.8, 77.7};
Here,
x.i
is initialized with 99,
x.f
is initialized with 88.8, and
complex::complex(double)
is called for the initialization of
x.c.
Braces can be elided in the
initializer-list
for any aggregate, even if the aggregate has members of a class type with
user-defined type conversions; see [dcl.init.aggr].
If
T
is a class type with no default constructor,
any declaration of an object of type
T
(or array thereof) is ill-formed if no
initializer
is explicitly specified (see [class.init] and [dcl.init]).