You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何左值引用与右值引用均可绑定函数?技术问询

函数左/右值引用绑定问题解析

先看示例代码:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 23:14:59