[class.conv.fct] (original) (raw)

11 Classes [class]

11.4 Class members [class.mem]

11.4.8 Conversions [class.conv]

11.4.8.3 Conversion functions [class.conv.fct]

A conversion function shall have no non-object parameters and shall be a non-static member function of a class or class template X; its declared return type is the conversion-type-id and it specifies a conversion from X to the type specified by the conversion-type-id, interpreted as a type-id ([dcl.name]).

[Note 1:

A conversion function is never invoked for implicit or explicit conversions of an object to the same object type (or a reference to it), to a base class of that type (or a reference to it), or to cv void.

Even though never directly called to perform a conversion, such conversion functions can be declared and can potentially be reached through a call to a virtual conversion function in a base class.

— _end note_]

[Example 1: struct X { operator int();operator auto() -> short; };void f(X a) { int i = int(a); i = (int)a; i = a;}

In all three cases the value assigned will be converted byX​::​operator int().

— _end example_]

A conversion function may be explicit ([dcl.fct.spec]), in which case it is only considered as a user-defined conversion for direct-initialization ([dcl.init]).

Otherwise, user-defined conversions are not restricted to use in assignments and initializations.

[Example 2: class Y { };struct Z { explicit operator Y() const;};void h(Z z) { Y y1(z); Y y2 = z; Y y3 = (Y)z; } void g(X a, X b) { int i = (a) ? 1+a : 0;int j = (a&&b) ? a+b : i;if (a) { } } — _end example_]

Theconversion-type-idshall not represent a function type nor an array type.

Theconversion-type-idin aconversion-function-idis the longest sequence of tokens that could possibly form a conversion-type-id.

[Note 2:

This prevents ambiguities between the declarator operator * and its expression counterparts.

[Example 3: &ac.operator int*i;

The * is the pointer declarator and not the multiplication operator.

— _end example_]

This rule also prevents ambiguities for attributes.

[Example 4: operator int [[noreturn]] (); — _end example_]

— _end note_]

[Note 3:

A conversion function in a derived class hides only conversion functions in base classes that convert to the same type.

A conversion function template with a dependent return type hides only templates in base classes that correspond to it ([class.member.lookup]); otherwise, it hides and is hidden as a non-template function.

Function overload resolution ([over.match.best]) selects the best conversion function to perform the conversion.

[Example 5: struct X { operator int();};struct Y : X { operator char();};void f(Y& a) { if (a) { } } — _end example_]

— _end note_]

Conversion functions can be virtual.

A conversion function template shall not have a deduced return type ([dcl.spec.auto]).

[Example 6: struct S { operator auto() const { return 10; } template<class T> operator auto() const { return 1.2; } }; — _end example_]