为什么参数修饰符(即'const'或'volatile')不被视为函数类型或签名的一部分?

Dan*_*aum 6 c++

请注意,以下两个函数具有相同的类型和签名:

void foo1(int t) {} // foo1 has type 'void(*)(int)', and signature '(*)(int)'
void foo2(const int t) {} // Also type 'void(*)(int)', signature '(*)(int)'
Run Code Online (Sandbox Code Playgroud)

(const不属于函数类型或函数签名).类似地,返回类型上的修饰符(constvolatile)不会影响函数类型或函数签名.

但是,在函数定义本身(未显示)中,命名变量t确实保留了const限定条件foo2.

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

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

参数修饰符(即constvolatile)不是函数类型或签名的一部分这一事实背后的基本原理是什么?

附录为清楚起见,从下面R.MartinhoFernandes的答案,我要澄清,在C++(我认为)的参数调节剂constvolatile,如果他们只是忽略了作为函数类型/签名的一部分顶级改性剂-见下面这个问题的答案.

R. *_*des 11

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

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

从技术实现的角度来看,唯一不同的是,void foo(int x)你可以变异x(即你的本地副本)的身上,但你不能变异xvoid foo(int const 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再次适用于整个类型如"常量(指针(INT))".