Hi,
I would like an example of a function call to an overloaded function,
where the most viable function is determined by the rules listed from
[over.ics.rank]/4.4.5 to [over.ics.rank]/4.4.8:
https://timsong-cpp.github.io/cppwp/n4868/over.ics.rank#4.4.5
These are four different tie-breakers for ranking standard conversions
from different source types, assuming the following class hierarchy:
struct A {}; struct B : C {}; struct C : B {};
(4.4.5) conversion of B* to A* is better than conversion of C* to A*,
(4.4.6) binding of an expression of type B to a reference to type A is
better than binding an expression of type C to a reference to type A,
(4.4.7) conversion of B::* to C::* is better than conversion of
A::* to C::*, and
(4.4.8) conversion of B to A is better than conversion of C to A.
The note says that these are only used for tie-breakers in the second
conversion sequence of user-defined conversions:
https://timsong-cpp.github.io/cppwp/n4868/over.ics.rank#note-1
However if two user-defined conversions yield different types before
the second conversion sequence, then they are necessarily have to use
different user-defined conversion functions or constructors, so the
conversion sequences would be indistinguishable by [over.ics.rank]/3,
as [over.ics.rank]/3.3 does not apply:
https://timsong-cpp.github.io/cppwp/n4868/over.ics.rank#3.3
This appears to be defective. There is full agreement that the following conversion is unambiguous:
struct A {};
struct B : A {};
struct C : B {};
struct X {
operator B*();
operator C*();
};
int f(A*);
int i = f(X()); // calls X::operator B*()
Likewise for the following 3 bullets of [over.ics.rank], and indeed in general (e.g. X->float->double vs. X->int->double).
Please consider filing a DR.
Note: while I appreciate that you value referring to a specific draft version, it would probably be better to refer to the numbering in the current draft, viz.
https://wg21.link/over.ics.rank#4.5.5 etc.
Having said that I have no idea what "or they initialize the same
class in an aggregate initialization" means here, maybe that's the key.
It has to mean [over.ics.list], but every user-defined conversion specified for aggregate initialization there is immediately followed by an identity conversion, so that text appears to be ineffectual. Possibly a separate DR would be a good idea.