【发布时间】:2016-06-18 12:32:33
【问题描述】:
为什么我不能重载这两个函数?
#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;
}
输出:
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);
【问题讨论】:
-
编译器将如何决定
int是否应该是const? -
常量和非常量没有区别
-
@EdHeal 从某种意义上说,它可以(如果标准会这么说,但它没有)。例如,将右值视为真正的常量(在
const/非const引用的情况下,它确实),并推断左值的常量(毕竟,编译器知道哪些左值标记为const)。是否存在其他可能出现的模棱两可的情况?但这会使已经非常重要的重载规则变得更加复杂。 -
@vsoftco 无论如何都会复制该值,参数的常量与参数的常量无关。不像对非 const 的引用,其中传递 const 参数的格式不正确。
-
@Oktalist 值被复制的事实不会阻止编译器将
const与non-const区分开来。事实上,在函数定义编译器中是这样做的:void f(const int a) { a = 0; }是一个错误。
标签: c++ overloading