为何左值引用与右值引用均可绑定函数?技术问询
函数左/右值引用绑定问题解析
先看示例代码:
using flref = int(&)(double); using frref = int(&&)(double); int foo(double){ return 32; } int main(){ flref l = foo; // Function lvalue references are bound to the function name frref r = foo; // Function rvalue references are bound to the function name return 0; }
1. 为何左值引用与右值引用均可绑定该函数?
这是C++标准的特殊规定:函数类型的右值引用允许绑定到函数左值。函数本身不是对象,不存在真正的“右值形式”——你没法生成一个函数的临时右值。因此标准放宽了函数右值引用的绑定规则,允许用函数左值(比如函数名)来初始化函数右值引用,这和普通对象的右值引用只能绑定右值的规则不同。
2. 函数名作为表达式时属于左值还是右值?
函数名作为表达式时是左值,类型为对应的函数类型(比如这里foo作为表达式是int(double)类型的左值)。左值的核心特征是可以被取地址,&foo能得到函数指针,这也印证了它的左值属性。
3. 在语句flref l = foo;中,赋值号右侧是否为表达式?
是的,这里的foo是一个表达式。当函数名出现在这样的初始化语境中时,它是一个函数类型的左值表达式——不同于大多数会隐式转换成函数指针的场景,这里因为直接绑定到函数引用,所以保留了原函数类型的左值表达式形态。
内容的提问来源于stack exchange,提问作者Yue Zhou
相关产品推荐
相关产品推荐

