考慮下面的代碼片斷:函數重載在C++(常量指針)
void foo(const int i) // First foo
{
std::cout << "First " << i << endl;
}
void foo(int i) // Second foo
{
std::cout << "Second " << i << endl;
}
int main()
{
int i = 5;
foo(i);
}
編譯錯誤: redefinition of 'void foo(int)'
由於const
S能夠與非const
對象被初始化,上述行爲似乎是合理的。現在考慮這個:
void foo_ptr(const int* p) // First foo_ptr
{
std::cout << "First " << *p << endl;
}
void foo_ptr(int* p) // Second foo_ptr
{
std::cout << "Second " << *p << endl;
}
int main()
{
int i = 5;
foo_ptr(&i); // Second foo_ptr gets called; prints 'Second 5'
}
,因爲它可能是清楚的,我的問題是 - 如果foo
在第一種情況下這兩個定義被認爲是相同的,那麼爲什麼它不是所以foo_ptr
在第二種情況下?或換句話說,爲什麼const
在第一種情況下被忽略,而在第二種情況下卻沒有被忽略?
可能重複http://stackoverflow.com/questions/3682049/functions-with-const-arguments-and-overloading – ThomasMcLeod
那個傻瓜解釋了爲什麼const int和int簽名被認爲是相同的,但OP理解得很好(按照第一個例子)。它並不包括爲什麼指針示例不具有相同的問題。 – paxdiablo