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

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

int main() {}

可以在g++ 4.8.1下成功编译。

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

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


从N4296第3.10节中,左值(lvalue)指的是一个函数或一个对象。右值(rvalue)是一个与对象无关的值,除其他外。所以,fn是一个函数,因此是一个左值。而且,fn评估为一个与对象无关的值(参见第1.8节:函数不是一个对象),因此是一个右值。这就是事实吗? - Tadeus Prastowo
我认为函数不是一个值。标准只在谈论对象和对象类型时使用术语“值”。 - Angew is no longer proud of SO
但是,一个表达式必须只能假设一个类别。因此,fn 必须是左值或右值之一,不能同时是两者。那么,表达式 fn 是左值还是右值? - Tadeus Prastowo
@Angew:如果我购买了那个(即表达式fn是一个左值),为什么void (&&rref)() = fn;会编译通过? - Tadeus Prastowo
1个回答

4
根据C++11 3.10/1,函数始终是lvalue。因此表达式fn是lvalue。
根据8.5.3/5,正确类型的函数可以用于初始化rvalue引用:
否则,引用应该是对非易失性const类型的lvalue引用(即cv1应为const),或者引用应该是rvalue引用。
如果初始化表达式是xvalue、class prvalue、array prvalue或者函数lvalue,并且“cv1T1”与“cv2T2”兼容,那么在第一种情况下引用将被绑定到初始化表达式的值中...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接