带有const参数和重载的函数

尝试了stackeroverflow qn所以它让我思考为什么不重载的function,我想出了一个稍微不同的代码,但它说,该function不能超载。 我的问题是为什么? 还是有另一种方式?

#include <iostream> using std::cout; class Test { public: Test(){ } int foo (const int) const; int foo (int ); }; int main () { Test obj; Test const obj1; int variable=0; do{ obj.foo(3); // Call the const function obj.foo(variable); // Want to make it call the non const function variable++; usleep (2000000); }while(1); } int Test::foo(int a) { cout<<"NON CONST"<<std::endl; a++; return a; } int Test::foo (const int a) const { cout<<"CONST"<<std::endl; return a; } 

不能仅仅基于非指针,非引用types的常量来重载。

例如,如果你是编译器。 面对的路线:

  cout <<obj.foo(3); 

你打哪个function?

当你通过价值传递的价值被复制的方式。 参数上的const只与函数定义有关。

§13.1标准讨论关于不能重载状态的声明 –

只有const和/或volatile存在或不存在的参数声明才是相同的。 也就是说,每个参数types的const和volatiletypes说明符被忽略 […]

只有参数types规范最外层的const和volatiletypes说明符才会被忽略; 隐藏在参数types规范中的const和volatiletypes说明符是重要的,可以用来区分重载的函数声明。 […]

当确定哪个函数被声明,定义或调用时。 “特别是,对于任何typesT,”指向T的指针“,”指向常量T的指针“和”指向易失性的T“都被认为是不同的参数types,如”对T的引用“,”对const T的引用“和“提到易变的T.”

编辑2:

由于post基本上是相同的作为职位 ,除了重载函数现在是类成员函数,我想说明一个额外的方面,可能是有用的,说明重载的概念是不一样的重载基于参数的“常量”(在类范围或命名空间范围内)。 然而,OP想要知道如何区分这两种过载。

如图所示,在成员函数调用的情况下,成功重载它们的方法依赖于隐含的第一个参数的cv限定。 当用于调用重载成员函数的对象expression式也是一个const时,只能调用“const”成员函数。 当使用非const对象expression式来调用重载成员函数调用时,非const版本是首选的,因为它是完全匹配的(对const成员函数重载的调用将需要第一个隐含参数的cv限定)

 #include <iostream> using std::cout; class Test { public: Test(){} int foo (const int) const; int foo (int ); }; int main () { Test obj; Test const objc; // const object obj.foo(3); // calls non const overload, object expression obj is non const objc.foo(3); // calls const overload, object expression objc is const } int Test::foo(int a) { a++; return a; } int Test::foo (const int a) const { return a; } 

正如对另一个问题的答案所解释的那样,这两个foo没有区别,因为它们具有相同的参数定义。