struct X {
X(int);
X(constchar*, int=0);
X(int, int);
};
void f(X arg){
X a =1; / a = X(1)
X b ="Jessie"; / b = X("Jessie",0)
a =2; / a = X(2)
f(3); / f(X(3))
f({1, 2}); / f(X(1,2))} — end example]
An explicit constructor constructs objects just like non-explicit
constructors, but does so only where the direct-initialization syntax ([dcl.init])
or where casts ([expr.static.cast], [expr.cast]) are explicitly
used; see also [over.match.copy].
A default constructor can be an explicit constructor; such a constructor
will be used to perform default-initialization
or value-initialization ([dcl.init]).
[Example 2: struct Z {explicit Z();
explicit Z(int);
explicit Z(int, int);
};
Z a; / OK, default-initialization performed
Z b{}; / OK, direct initialization syntax used
Z c ={}; / error: copy-list-initialization
Z a1 =1; / error: no implicit conversion
Z a3 = Z(1); / OK, direct initialization syntax used
Z a2(1); / OK, direct initialization syntax used
Z* p =new Z(1); / OK, direct initialization syntax used
Z a4 =(Z)1; / OK, explicit cast used
Z a5 =static_cast<Z>(1); / OK, explicit cast used
Z a6 ={3, 4}; / error: no implicit conversion — end example]