为什么带有const参数的函数声明允许调用带有非const参数的函数?

Ale*_*rty 12 c++ compilation

记下以下C++代码:

#include <iostream>
using std::cout;

int foo (const int);

int main ()
{
   cout << foo(3);
}

int foo (int a)
{
   a++;
   return a;
}
Run Code Online (Sandbox Code Playgroud)

请注意,原型foo()采用a const int并且定义采用int.这个编译没有任何错误......

为什么没有编译错误?

Bri*_*ndy 33

因为foo函数的调用者是否foo修改了它的变量副本并不重要.

特别是在C++ 03标准中,以下2个片段解释了为什么:

C++ 03 Section:13.2-1

如果两个函数声明属于同一作用域且具有等效的参数声明(13.1),则它们引用相同的函数.

C++ 03 Section:13.1-3

仅存在或不存在const和/或volatile的参数声明是等效的.仅以这种方式忽略参数类型规范最外层的const和volatile类型说明符; 埋在参数类型规范中的const和volatile类型说明符很重要,可用于区分重载的函数声明.

  • +1:在没有标准中的内容的情况下,第二个引用很容易被误解"只有参数类型规范最外层的const和volatile类型说明符才会以这种方式被忽略; const和volatile类型说明符被隐藏在参数类型规范很重要,可用于区分重载函数声明.112)".所以'int const*p'和'int volatile*p'是不同的 (2认同)

Jer*_*fin 13

顶级const(即,适用于传递的值,而不是它指向或引用的值)仅影响函数的实现,而不影响接口.编译器从接口角度(即调用端)忽略它,并仅在实现(即函数体中的代码)上强制执行它.

  • @ Steve314:怎么*敢*你暗示我的说法比引用标准更不明确!:-) (3认同)