涉及函数类型的表达式是左值还是右值?
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 ...
(缩短,强调我的)
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 “cv2T2
”, or- ...
then the reference is bound to the value of the initializer expression in the first case ...
(缩短,强调我的)