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
相关产品推荐
相关产品推荐

