【问题标题】: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- 限定类型。

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

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

谢谢。

【问题讨论】:

    标签: c function lvalue


    【解决方案1】:

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

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

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

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

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

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

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

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

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

    【讨论】:

    • 什么是“对象的定义”?
    • 数组类型的左值是不可修改的左值。这意味着我们不能将数组重新分配给数组名称。我们可以将函数重新分配给函数名称吗?
    • @Tim 你曾经使用 C 编译器编译过一行代码吗?如果你这样做了,那么你也会知道 6.5.16p2。
    • @Tim - 不,我们不能。如果你翻到关于赋值表达式的部分,你会注意到它有一个约束,需要在左侧有一个可修改的左值。由于它排除了我们建立的函数类型,因此无法重新分配。
    猜你喜欢
    • 1970-01-01
    • 2020-07-07
    • 2021-09-17
    • 2014-12-15
    • 2014-12-20
    • 2015-09-19
    • 2016-05-09
    • 2016-09-13
    • 1970-01-01
    相关资源
    最近更新 更多