案例1: 你可以重载两个函数,即:
void foo(int *);
void foo(const int *);
在进来的时候,
案例2:
你不能重载两个函数:
void foo(int);
void foo(const int);
我已编码并检查了这个概念,但却无法找出导致重载变化的原因。
答案 0 :(得分:1)
正式参数的顶级CV资格被忽略。确定函数的类型。
(简历:const
或volatile
)
理解它的一种方法是,正式参数的顶级CV限定无法影响函数的调用者,并且它不会影响机器代码。这只是关于实施的限制。因此,如果您愿意,可以使用void foo( int )
作为声明void foo( const int )
,反之亦然。
答案 1 :(得分:1)
来自标准§13.1
参数声明仅在 存在或不存在时有所不同 const和/或volatile是等价的 。也就是说,const和volatile 确定时,将忽略每个参数类型的类型说明符 正在声明,定义或调用哪个函数。 [例如:
typedef const int cInt;
int f (int);
int f (const int); // redeclaration of f(int)
int f (int) { /* ... */ } // definition of f(int)
int f (cInt) { /* ... */ } // error: redefinition of f(int)
-end example]
只有最外层的const和volatile类型说明符 以这种方式忽略参数类型规范;常量 和volatile类型说明符隐藏在参数类型中 规范是重要的,可用于区分 重载函数声明。特别是对于任何类型的T, “指向T的指针”,“指向const T的指针”, 和“指向易失性T的指针” 是 被认为是不同的参数类型, 和“对T的引用”一样 “引用const T”和“引用volatile T”。
答案 2 :(得分:0)
在第二种情况下,因为整数是基本类型,int
或const int
按值传递,函数会复制变量。因此,函数定义是相同的。
在第一种情况下,第一个函数接受一个整数指针作为参数,而第二个函数接受一个指向常量整数的指针。这些是不同的数据类型,因为整数的值不是由指针的值复制的,因此数据通过引用传递。