[class.conv.ctor] (original) (raw)
11 Classes [class]
11.4 Class members [class.mem]
11.4.7 Conversions [class.conv]
11.4.7.1 Conversion by constructor [class.conv.ctor]
A constructor that is not explicit ([dcl.fct.spec]) specifies a conversion from the types of its parameters (if any) to the type of its class.
Such a constructor is called aconverting constructor.
[ Example
:
struct X { X(int); X(const char*, int =0); X(int, int); };
void f(X arg) {
X a = 1;
X b = "Jessie";
a = 2;
f(3);
f({1, 2});
}
— end example
]
[ Note
:
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 may be an explicit constructor; such a constructor will be used to perform default-initialization or value-initialization ([dcl.init]).
[ Example
:
struct Z { explicit Z(); explicit Z(int); explicit Z(int, int); };
Z a;
Z b{};
Z c = {};
Z a1 = 1;
Z a3 = Z(1);
Z a2(1);
Z* p = new Z(1);
Z a4 = (Z)1;
Z a5 = static_cast(1);
Z a6 = { 3, 4 };
— end example
]
— end note
]
A non-explicit copy/move constructor ([class.copy.ctor]) is a converting constructor.
[ Note
:
An implicitly-declared copy/move constructor is not an explicit constructor; it may be called for implicit type conversions.
— end note
]