Function Overloading with Const Arguments
In C , function overloading allows us to define multiple functions with the same name but with different argument types or numbers. However, there are limitations to overloading based on the constness of arguments.
Consider the given code:
#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); // Attempt to 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; }
This code attempts to overload the foo function based on the constness of the argument. However, the compiler raises an error stating that the function cannot be overloaded.
Explanation
In C , overloading functions based solely on the constness of a non-pointer, non-reference type argument is not allowed. This is because the compiler cannot differentiate between the two functions based on the constness of the value being passed by value.
In the given code, both versions of foo receive an integer by value. When the argument is passed by value, a copy of the variable is created, and the constness of the formal parameter does not affect the value of the copy.
Therefore, the compiler has no way to determine which version of foo to call if passed a non-const integer by value. This ambiguity violates the overloading prohibition against functions with the same signature.
Alternative Approach
To achieve the desired behavior, an alternative approach can be used. One option is to use pass-by-reference with explicit constness, as shown below:
int foo(const int& a); int foo(int& a);
With this approach, the compiler can distinguish between the two functions based on the constness of the reference, allowing for proper overloading.
The above is the detailed content of Can C functions be overloaded based solely on the constness of a non-pointer, non-reference argument?. For more information, please follow other related articles on the PHP Chinese website!