C++中重载的概念

concept of overloading in C++

案例 1: 您可以重载两个函数,即:

void foo(int *);
void foo(const int *);

在 , 案例 2: 你不能重载两个函数:

void foo(int);
void foo(const int);

我已经编码并检查了这个概念,但无法找出这种重载变化的原因。

正式论证的顶级 CV 资格将被忽略。确定函数的类型。

(简历:constvolatile

一种理解方式是,形式参数的顶级 CV 限定不可能影响函数的调用者,也不会影响机器代码。这只是关于实施的限制。所以给定一个声明 void foo( int ) 你可以使用 void foo( const int ) 来实现,反之亦然,如果你愿意的话。

在第二种情况下,因为整数是原始类型,intconst int 是按值传递的,函数会复制变量。因此,函数定义是相同的。

在第一种情况下,第一个函数接受一个整数指针作为参数,而第二个函数接受一个指向常量整数的指针。这些是不同的数据类型,因为整数的值不会被指针的值复制,因此数据是通过引用传递的。

来自标准 §13.1

Parameter declarations that differ only in the presence or absence of const and/or volatile are equivalent. That is, the const and volatile type-specifiers for each parameter type are ignored when determining which function is being declared, defined, or called. [ Example:

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 ]

Only the const and volatile type-specifiers at the outermost level of the parameter type specification are ignored in this fashion; const and volatile type-specifiers buried within a parameter type specification are significant and can be used to distinguish overloaded function declarations. In particular, for any type T, “pointer to T,” “pointer to const T,” and “pointer to volatile T” are considered distinct parameter types, as are “reference to T,” “reference to const T,” and “reference to volatile T.”