函数类型的左值是不是是可修改的左值?

Posted

技术标签:

【中文标题】函数类型的左值是不是是可修改的左值?【英文标题】:Is an lvalue of a function type a modifiable lvalue or not?函数类型的左值是否是可修改的左值? 【发布时间】:2020-10-11 12:38:56 【问题描述】:

6.3.2.1 C11 标准中的左值、数组和函数指示符说

一个可修改的左值是一个左值 没有数组类型,没有不完整的类型,没有 const- 限定类型,如果它是结构或联合,则没有任何成员(包括, 递归地,所有包含的聚合或联合的任何成员或元素)具有 const- 限定类型。

函数类型的左值是否是可修改的左值?

引用没有提到函数类型,但实际上,我认为函数类型的左值不是可修改的左值。 (数组类型的左值和函数类型的左值也有一些相似之处:都转换为数组和函数的地址。)

谢谢。

【问题讨论】:

【参考方案1】:

函数类型的左值是否是可修改的左值?

问题包含用词不当。根据定义,左值仅指定一个对象。在您引用的段落的前面(p1),它指定

左值是一个表达式(对象类型不是 void),它可能指定一个对象;

函数不计入对象的定义中,因此不存在函数类型的左值。

相反,函数类型有一个单独的类别。在第 6.3.2.1 节中,第 4 段:

函数指示符是具有函数类型的表达式。除非它是 sizeof 运算符、_Alignof 运算符或一元 & 运算符的操作数,否则类型为“函数返回类型”的函数指示符将转换为类型为“指针”的表达式函数返回类型''。

所以这个问题主要是没有实际意义的。根据左值指定事物的表达式不必关心函数类型。相反,如果适用,表达式的规范将提及它如何使用“函数指示符”进行操作

我认为函数类型的左值不是可修改的左值

正确,但这又是因为根本不计入左值。

【讨论】:

什么是“对象的定义”? @Tim - port70.net/~nsz/c/c11/n1570.html#3.15 数组类型的左值是不可修改的左值。这意味着我们不能将数组重新分配给数组名称。我们可以将函数重新分配给函数名称吗? @Tim 你曾经使用 C 编译器编译过一行代码吗?如果你这样做了,那么你也会知道 6.5.16p2。 @Tim - 不,我们不能。如果你翻到关于赋值表达式的部分,你会注意到它有一个约束,需要在左侧有一个可修改的左值。由于它排除了我们建立的函数类型,因此无法重新分配。

以上是关于函数类型的左值是不是是可修改的左值?的主要内容,如果未能解决你的问题,请参考以下文章

C 错误:表达式必须是可修改的左值

为啥我得到的表达式必须是可修改的左值?

表达式必须是可修改的左值(字符数组)

错误:表达式必须是可修改的左值

C++ 表达式必须是可修改的左值

循环中分配的多维数组说明:表达式必须是可修改的左值