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

C++20中‘函数左值(function lvalue)’是什么?标准提及五次却无定义

C++20中的函数左值(function lvalue)

C++20标准并未给“函数左值”单独提供显式的定义条款,但它是左值(lvalue)范畴下针对函数类型的特定子类型,可通过标准中关于值类别和函数类型的规则明确其含义:

  • 函数左值的本质是拥有函数类型的左值表达式。左值的核心属性是可被取地址(函数左值均满足此属性),除特定语境外,函数左值会隐式转换为函数指针右值。

以下场景中的表达式均属于函数左值:

  • 直接使用的函数名:比如定义void foo() {}后,foo就是函数左值
  • 函数指针的解引用结果:void (*fp)() = &foo; *fp 这里的*fp是函数左值
  • 类成员函数的限定名:struct S { void bar() {} }; S::bar 属于成员函数左值,是函数左值的子类别

标准中提及“函数左值”时,对应的规则包括:

函数左值作为&运算符的操作数时,会生成指向该函数的指针
除非作为&的操作数、绑定到函数左值引用,函数左值会被隐式转换为函数指针右值

示例代码:

void demo_func() {}

// 将函数左值绑定到左值引用
void (&func_ref)() = demo_func;

// 取函数左值的地址,得到函数指针
void (*func_ptr)() = &demo_func;

// 函数左值隐式转换为函数指针
void (*func_ptr2)() = demo_func;

需要注意:函数左值是不可修改的左值,尝试对其赋值会触发编译错误:

demo_func = func_ptr; // 编译错误:无法向函数左值赋值

内容的提问来源于stack exchange,提问作者Ayrosa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 04:05:56