2016-12-20 28 views
1
#include <iostream> 

using namespace std; 

void somefunc(int a) 
{ 
    cout<<"somefunc1"; 
} 

void somefunc(int &b) 
{ 
    cout<<"somefunc2"; 
} 

int main() 
{ 

    // case 1 
    somefunc(10); // works fine and prints somefunc1 

    //case2 
    int b=10; 
    somefunc(b); // generates compiler error that overloading is ambiguous 

    return 0; 
} 

main()如果我通過一個常數(比如說10)程序編譯和運行並打印"somefunc1",但是當我傳遞變量(b在這種情況下)編譯器產生一個錯誤超載是不明確的。函數重載 - 傳遞恆定VS傳遞變量C++

我不明白它是如何在內部工作的。 請幫忙!!

+3

這是因爲綁定到引用是一個「完全匹配」,所以重載是不明確的。 –

+1

你稱之爲*「常量」*稱爲*「整數字面量」*。傳遞常量(例如'const int c = 10;')會產生不同的結果。爲什麼傳遞'c'與傳遞'b'不同,這是對讀者的一個練習。 – IInspectable

+1

@IInspectable:你的常數[也可以正常工作](http://ideone.com/NbWeSW)。 –

回答

4

重載分辨率的規則有點複雜。這是一個簡化,適用於這個特定的例子。

編譯器經歷的第一步是找到「重載集」,也就是可以用參數調用的一組函數。對於somefunc(10),只能調用somefunc(int); somefunc(int&)不能被調用,因爲10是一個常量,不能被(非const)引用傳遞。所以在重載集合中只有一個函數,那就是被調用的函數。

對於somefunc(b),可以調用這兩個函數。所以過載設置有兩個功能,somefunc(int)somefunc(int&)。現在編譯器必須確定哪個函數是參數10的「最佳匹配」。並且規則是intint&都提供了「完全匹配」,所以規則不會比其他規則優先,並且調用不明確。

如果函數的第二個版本是somefunc(const int&)而不是somefunc(int&)那麼調用somefunc(10)也是不明確的。

+0

如果是這種情況,那麼對於這種情況就不應該允許超載。 – Swapnil

+0

@Swapnil:如果你想要這樣做,你需要製作一份文件,並聯系[WG21](http://www.open-std.org/jtc1/sc22/wg21/)。 – IInspectable

+0

@Swapnil - 你指的是哪種情況? –