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)