2010-03-16 30 views
7

我得到了答案不!因爲按值傳遞和按引用傳遞看起來與調用者相同。只能根據參數是值還是參考來重載函數嗎?

但是,下面的代碼編譯正確

class A { 

public: 
void f(int i) {}  

void f(int& i) {} 
}; 

但是當我嘗試使用它,沒有編譯錯誤。

int main() { 

    A a; 
    int i = 9; 
    int& j = i; 
    a.f(1); 
    a.f(i); 
    a.f(j); 
    return 0; 
} 

爲什麼編譯器不會禁用它,即使不知道它將被使用?

+2

這將幫助,如果你表現出實際的編譯器錯誤和行號。 – 2010-03-16 21:20:32

+3

dupe:http://stackoverflow.com/questions/930323/f5-and-int-x-fx-to-call-different-functions – 2010-03-16 21:51:45

回答

3

是的,它們可以基於參考或不參考而被重載。這就是爲什麼讓它們像這樣共存是完美的;他們是不同的。

該問題與含糊不清有關。雖然f(1)只能在一個變體上調用,但可以在兩者上調用f(i)。兩者都不是最好的,因此你會得到一個模棱兩可的錯誤。如果添加了第三個函數foo (const int&),,則所有調用都將不明確。但是所有這些仍然是相互超載,並且沒有衝突。

我同意奇怪的是能夠有三個重載的函數,並且能夠直接調用none。也許別人有更多的補充。

9

可以相互調用方法:

void (A::*t)(int&) =&A::f; 
A a; 
int i = 9; 
int& j = i; 
a.f(1); // f(int i) 
(a.*t)(i); // f(int& i) 
+1

+1 for clever :) – GManNickG 2010-03-16 21:18:51

+5

'(a。* f)(i) ;'應該就夠了。 – 2010-03-16 21:22:21

+1

你可能是指(a。* t)(i); (不是(a。* f)) – a1ex07 2010-03-16 21:29:32