This is an unofficial snapshot of the ISO/IEC JTC1 SC22 WG21 Core Issues List revision 116a. See http://www.open-std.org/jtc1/sc22/wg21/ for the official list.
2024-12-19
[Accepted as a DR at the November, 2023 meeting.]
Consider:
struct A {
static void f();
static void f(int);
} x;
void (*p)() = x.f; // error
This is ill-formed as confirmed by issue 61. Various other changes (see issue 2241) have put the following example into the same category:
struct B {
static void f();
} y;
void (*q)() = y.f; // error
If this is the intended outcome (although major implementations disagree), then the rules in 7.6.1.5 [expr.ref] should be clarified accordingly.
Proposed resolution (approved by CWG 2023-06-13):
Change in 7.6.1.5 [expr.ref] bullet 6.3 as follows:
- ...
- If E2 is an overload set, the expression shall be the (possibly-parenthesized) left-hand operand of a member function call (7.6.1.3 [expr.call]), and function overload resolution (12.2 [over.match]) is used to select the function to which E2 refers. The type of E1.E2 is the type of E2 and E1.E2 refers to the function referred to by E2.
- If E2 refers to a static member function, E1.E2 is an lvalue.
- Otherwise (when E2 refers to a non-static member function), E1.E2 is a prvalue.
The expression can be used only as the left-hand operand of a member function call (11.4.2 [class.mfct]).[Note 5: Any redundant set of parentheses surrounding the expression is ignored (7.5.4 [expr.prim.paren]). —end note]- ...
This also addresses issue 1038.