An *id-expression*
whose terminal name refers to an overload set S and
that appears without arguments
is resolved to
a function,
a pointer to function, or
a pointer to member function
for a specific function
that is chosen from a set of functions selected from S
determined based on the target type required in the context (if any),
as described below.

The target can be

- an object or reference being initialized ([dcl.init], [dcl.init.ref], [dcl.init.list]),
- the left side of an assignment,
- a parameter of a function ([expr.call]),
- a parameter of a user-defined operator,
- the return value of a function, operator function, or conversion ([stmt.return]),
- an explicit type conversion ([expr.type.conv], [expr.static.cast], [expr.cast]), or
- a non-type
*template-parameter*([temp.arg.nontype]).

[*Note 1*: *end note*]

Any redundant set of parentheses surrounding the function name is
ignored ([expr.prim.paren]).

— If there is no target, all non-template functions named are selected.

Otherwise, a non-template function with type F
is selected for the function type FT of the target type
if F
(after possibly applying the function pointer conversion ([conv.fctptr]))
is identical to FT.

The specialization, if any, generated by template argument deduction
([temp.over], [temp.deduct.funcaddr], [temp.arg.explicit])
for each function template named
is added to the set of selected functions considered.

Non-member functions and static member functions
match targets of function pointer type or
reference to function type.

Non-static member functions match targets of
pointer-to-member-function type.

[*Note 3*: *end note*]

If a non-static member function is chosen,
the result can be used only to form a pointer to member ([expr.unary.op]).

— All functions with
associated constraints
that are not satisfied ([temp.constr.decl])
are eliminated from the set of selected functions.

If more than one function in the set remains,
all function template specializations
in the set
are eliminated if the set also contains a function that is not a
function template specialization.

Any given non-template function
F0
is eliminated if the set contains a second
non-template function that
is more constrained than
F0
according to
the partial ordering rules of [temp.constr.order].

Any given
function template specialization
F1
is eliminated if the set contains a second
function template specialization whose function template
is more specialized than the
function template of
F1
according to
the partial ordering rules of [temp.func.order].

After such eliminations,
if any, there shall remain exactly one selected function.

[*Example 1*: int f(double);
int f(int);
int (*pfd)(double) = &f; // selects f(double)
int (*pfi)(int) = &f; // selects f(int)
int (*pfe)(...) = &f; // error: type mismatch
int (&rfi)(int) = f; // selects f(int)
int (&rfd)(double) = f; // selects f(double)
void g() {
(int (*)(int))&f; // cast expression as selector
}

The initialization of
pfe
is ill-formed because no
f()
with type
int(...)
has been declared, and not because of any ambiguity.

For another example,

struct X {
int f(int);
static int f(long);
};
int (X::*p1)(int) = &X::f; // OK
int (*p2)(int) = &X::f; // error: mismatch
int (*p3)(long) = &X::f; // OK
int (X::*p4)(long) = &X::f; // error: mismatch
int (X::*p5)(int) = &(X::f); // error: wrong syntax for
// pointer to member
int (*p6)(long) = &(X::f); // OK
— *end example*]