Template argument deduction is done by comparing the return type of
the
conversion function template
(call it
P)
with the type specified by the conversion-type-id of the
conversion-function-id being looked up
(call it A) as described in [temp.deduct.type].
If P is a reference type, the type referred to by P is used in place
of P for type deduction and for any further references to or transformations of
P in the remainder of this subclause.
If
P
is an array type, the pointer type produced by the
array-to-pointer standard conversion ([conv.array]) is used in place of
P
for type
deduction; otherwise,
If
P
is a function type, the pointer type produced by the
function-to-pointer standard conversion ([conv.func]) is used in place of
P
for
type deduction; otherwise,
If the original A is
a function pointer or pointer-to-member-function type
with a potentially-throwing exception specification ([except.spec]),
the exception specification.