Am Mi., 28. Mai 2025 um 13:05 Uhr schrieb Russell Shaw via Std-Discussion <std-discussion@lists.isocpp.org>:
Hi,

In [expr.ref], there is:

-----------------------------------------------
If E2 is declared to have type “reference to T”, then E1.E2 is an lvalue of type
T. If E2 is a static data member, E1.E2 designates the object or function to
which the reference is bound, otherwise E1.E2 designates the object or function
to which the corresponding reference member of E1 is bound. Otherwise, one of
the following rules applies.
-----------------------------------------------

"E1.E2 designates the object or function to which the reference is bound"
conflicts with "If E2 is a static data member"

What does it mean ?
One bit's saying it's an object and another saying it's a function.

There is no conflict. A data member can have type reference to function or reference to object.

Consider:

int var;

using f_t = void();

void f(){}

struct C
{
  static int& sr;
  int& r;
  static f_t& sf;
} c(var);

int& C::sr = var;
f_t& C::sf = f;

int main()
{
  (void) c.sr;
  (void) c.r;
  (void) c.sf;
}
 

Now take: "E1.E2 designates the object or function to which the reference is
bound, otherwise E1.E2 designates the object or function to which the
corresponding reference member of E1 is bound". Isn't that two sentences saying
the same thing ?

No. The sentence makes sense if your include the omitted first part of the sentence: " If E2 is a static data member, ..."

Now we have two arms describing different situations:

1)  "If E2 is a static data member, E1.E2 designates the object or function to which the reference is bound": This is relevant for the static data members C::sr and C::sf in above example
2) " otherwise E1.E2 designates the object or function to which the corresponding reference member of E1 is bound ": This is relevant for the non-static data meber C::r in above example.
 
- Daniel