An implicit conversion sequence is the sequence
of conversions required to convert an argument in a function call
to the type of the corresponding parameter in a function declaration.
The compiler will try to determine an implicit conversion
sequence for each argument. It will then categorize each implicit
conversion sequence in one of three categories and rank them depending
on the category. The compiler will not allow any program in which
it cannot find an implicit conversion sequence for an argument.
The following are the three categories of conversion sequences
in order from best to worst:
Note: Two standard conversion sequences or two user-defined
conversion sequences may have different ranks.
Standard conversion sequences
Standard
conversion sequences are categorized in one of three ranks. The ranks
are listed in order from best to worst:
- Exact match: This rank includes the following conversions:
- Identity conversions
- Lvalue-to-rvalue conversions
- Array-to-pointer conversions
- Qualification conversions
- Promotion: This rank includes integral and floating point promotions.
- Conversion: This rank includes the following conversions:
- Integral and floating-point conversions
- Floating-integral conversions
- Pointer conversions
- Pointer-to-member conversions
- Boolean conversions
The compiler ranks a standard conversion sequence by its
worst-ranked standard conversion. For example, if a standard conversion
sequence has a floating-point conversion, then that sequence has conversion
rank.
User-defined conversion
sequences
A
user-defined conversion sequence consists
of the following:
- A standard conversion sequence
- A user-defined conversion
- A second standard conversion sequence
A user-defined conversion sequence A is
better than a user-defined conversion sequence B if
the both have the same user-defined conversion function or constructor,
and the second standard conversion sequence of A is
better than the second standard conversion sequence of B.
Ellipsis conversion
sequences
An ellipsis conversion sequence occurs
when the compiler matches an argument in a function call with a corresponding
ellipsis parameter.