请注意,以下两个函数具有相同的类型和签名:
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
确实保持const
了foo2
.
有许多 StackOverflow 问题讨论了为什么函数的返回类型不被视为函数签名的一部分(用于重载解析)。
但是,我找不到任何 StackOverflow 问题来询问为什么参数修饰符(const
或volatile
)不是函数类型或签名的一部分。另外,我直接查看了 C++11 标准文档,发现很难解开。
const
参数修饰符(即和volatile
)不是函数类型或签名的一部分这一事实背后的基本原理是什么?
附录为了清楚起见,从下面 R.MartinhoFernandes 的回答中,我应该澄清在 C++ 中(我认为)参数修饰符const
,并且如果它们是顶级volatile
修饰符,则仅作为函数类型/签名的一部分被忽略- 请参见下面的答案。