涉及函数类型的表达式是左值还是右值?

Is an expression involving function type an lvalue or an rvalue?

void fn() {}
void (&lref)() = fn;
void (&&rref)() = fn;

int main() {}

在 g++ 4.8.1 下编译良好。

所以,fn是一个表达式,根据ISO标准,表达式必须有一个类别。

在执行任何自动类型提升之前,表达式属于哪个类别(因为两个引用都可以接受对表达式fn求值的结果)?

根据 C++11 3.10/1,函数始终是左值。所以表达式 fn 是一个左值。

根据 8.5.3/5,正确类型的函数可用于初始化右值引用:

  • Otherwise, the reference shall be an lvalue reference to a non-volatile const type (i.e., cv1 shall be const), or the reference shall be an rvalue reference.

    • If the initializer expression

      • is an xvalue, class prvalue, array prvalue or function lvalue and “cv1 T1” is reference-compatible with “cv2 T2”, or
      • ...

      then the reference is bound to the value of the initializer expression in the first case ...

(缩短,强调我的)