C++ 为什么这两个函数不能重载?
为什么我不能重载这两个函数C++ 为什么这两个函数不能重载?,c++,overloading,C++,Overloading,为什么我不能重载这两个函数 #include <iostream> using namespace std; class Base { public: void run(int a); void run(const int a); }; int main() { // your code goes here return 0; } 根据标准: 13.1可重载声明 (3.4)-仅在存在或不存在const和/或volatile时不同的参数声明如
#include <iostream>
using namespace std;
class Base
{
public:
void run(int a);
void run(const int a);
};
int main() {
// your code goes here
return 0;
}
根据标准: 13.1可重载声明
(3.4)-仅在存在或不存在
const
和/或volatile
时不同的参数声明如下:
相等的也就是说,每个参数类型的const
和volatile
类型说明符在
确定要声明、定义或调用的函数。[示例:
-[结束示例]
只有参数类型规范最外层的const
和volatile
类型规范
以这种方式被忽视const
和volatile
参数类型中的类型说明符
规范非常重要,可用于区分重载函数声明。在里面
特别是,对于任何类型的T
,“指针指向T
,”指针指向const T
,“指针指向volatile T
”是
被认为是不同的参数类型,如“引用T
,”引用const T
,“引用
volatile T
”
根据标准: 13.1可重载声明
(3.4)-仅在存在或不存在
const
和/或volatile
时不同的参数声明如下:
相等的也就是说,每个参数类型的const
和volatile
类型说明符在
确定要声明、定义或调用的函数。[示例:
-[结束示例]
只有参数类型规范最外层的const
和volatile
类型规范
以这种方式被忽视const
和volatile
参数类型中的类型说明符
规范非常重要,可用于区分重载函数声明。在里面
特别是,对于任何类型的T
,“指针指向T
,”指针指向const T
,“指针指向volatile T
”是
被认为是不同的参数类型,如“引用T
,”引用const T
,“引用
volatile T
”
编译器将如何决定
int
是否应该是const
?const和non-const不是different@EdHeal从某种意义上说,它可以(如果标准会这么说,但事实并非如此)。例如,将右值视为真常量(如const
/非const
引用),并推断左值的常量(毕竟,编译器知道哪些左值标记为const
)。是否存在任何可能以其他方式出现的模棱两可的情况?但这将使重载规则变得更加复杂,因为重载规则已经非常重要了。@vsoftco值是复制的。无论如何,参数的常量与参数的常量无关。例如,与非常量引用不同,在非常量引用中传递常量参数的格式不正确。@Oktalist复制值的事实不会阻止编译器区分const
和non-const
。事实上,在函数定义编译器中是这样做的:void f(const int a){a=0;}
是一个错误。编译器如何决定int
是否应该是const
?const和non-const不是different@EdHeal从某种意义上说,它可以(如果标准会这么说,但事实并非如此)。例如,将右值视为真常量(如const
/非const
引用),并推断左值的常量(毕竟,编译器知道哪些左值标记为const
)。是否存在任何可能以其他方式出现的模棱两可的情况?但这将使重载规则变得更加复杂,因为重载规则已经非常重要了。@vsoftco值是复制的。无论如何,参数的常量与参数的常量无关。例如,与非常量引用不同,在非常量引用中传递常量参数的格式不正确。@Oktalist复制值的事实不会阻止编译器区分const
和non-const
。事实上,在函数定义编译器中是这样做的:void f(const int a){a=0;}
是一个错误。是的run(cont int&)
并不等同于run(int&)
。正如@juanchopanza所说,当你引用引用时,这句话似乎不适用。@juanchopanza是的,我不得不引用到最后,谢谢@StefanMonov正确,扩展。是的run(cont int&)
并不等同于run(int&)
。正如@juanchopanza所说,当你引用参考资料时,这句话似乎不适用。@juanchopanza是的,我不得不一直引用到最后,谢谢@StefanMonov正确,扩展。
prog.cpp:8:7: error: 'void Base::run(int)' cannot be overloaded
void run(const int a);
^
prog.cpp:7:7: error: with 'void Base::run(int)'
void run(int a);
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)