加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 为什么参数修饰符(即’const’或’volatile’)不被视为函数

发布时间:2020-12-16 03:22:42 所属栏目:百科 来源:网络整理
导读:请注意,以下两个函数具有相同的类型和签名: void foo1(int t) {} // foo1 has type 'void(*)(int)',and signature '(*)(int)'void foo2(const int t) {} // Also type 'void(*)(int)',signature '(*)(int)' (const不是函数类型或函数签名的一部分).类似地,
请注意,以下两个函数具有相同的类型和签名:
void foo1(int t) {} // foo1 has type 'void(*)(int)',and signature '(*)(int)'
void foo2(const int t) {} // Also type 'void(*)(int)',signature '(*)(int)'

(const不是函数类型或函数签名的一部分).类似地,返回类型上的修饰符(const或volatile)不会影响函数类型或函数签名.

但是,在函数定义本身(未显示)中,命名变量t确实在foo2中维护const限定.

有许多StackOverflow问题讨论为什么函数的返回类型不被视为函数签名的一部分(用于重载解析).

但是,我找不到任何StackOverflow问题,询问为什么参数修饰符(const或volatile)不是函数类型或签名的一部分.另外,我直接查看了C 11标准文档,发现很难解开.

参数修饰符(即const和volatile)不属于函数类型或签名的事实背后的基本原理是什么?

附录为了清楚起见,从下面的R.MartinhoFernandes的答案中,我应该澄清一下,在C(我认为)中,如果它们是顶级修饰符,则参数修饰符const和volatile仅作为函数类型/签名的一部分被忽略 – 请参阅下面的答案.

解决方法

What is the rationale behind the fact that argument modifiers (i.e.,const and volatile) are not part of a function’s type or signature?

从调用者的角度来看,void foo(int)和void foo(int const)之间没有区别.无论您传递给它的是什么,都不会被修改,无论修饰符如何:该函数将获得一个副本.

从实现者的角度来看,唯一的区别是使用void foo(int x),你可以在体内改变x(即你的本地拷贝),但你不能用void foo(int const x)改变x.

C承认这两个观点.通过使两个声明为void foo(int)来确认调用者的观点;和void foo(int const);声明相同的功能.通过允许您将函数声明为void foo(int x)来承认实现者的观点;但如果你想确保不小心分配给参数,请将其定义为void foo(int const x){/*…*/}.

请注意,这仅适用于顶级const,即适用于整个类型的const.比如int const&或者int const *修饰符仅适用于类型的一部分,作为“指向(const(int))”的指针,因此它不是顶级const.但是在int * const中,const再次适用于整个类型,如“const(指向(int))”.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读