2012-03-25 75 views

回答

2

你可以做這樣的事情:

int main() 
{ 
    int a = 42; 
    void (*fp)(int&) = &f; // (A) 
    fp(a); 
} 

在這裏,我們正在做一個函數指針的重載函數f之一。由於explained in my answer to another question,編譯器將選擇適當的函數使行(A)工作。請注意,我沒有使用演員;這樣,如果我更改函數簽名以使上述不起作用,編譯器將發出錯誤,而不是潛在地允許代碼調用未定義的行爲。

儘管對於這種情況,最好只給兩個函數不同的名稱。像這樣:

void take_f(int) {} 
void modify_f(int&) {} 

int main() 
{ 
    int a = 42; 
    modify_f(a); 
} 

這允許代碼有更清晰的意圖,你不會有超載的問題。當然,你可以拿出比take_f()modify_f()更好的名字。

無論如何,這種方式更有意義,因爲有一個功能可以是int而另一個int&可能是一個很好的標誌,他們正在做很大不同的事情(因此保證不同的功能名稱)。

+0

所以,更一般的問題 - 引用不是類型T的一部分?我的意思是,對於星號它正常工作。 – innochenti 2012-03-25 14:05:52

+0

@innochenti:引用*是*類型的一部分,但是這兩個重載是不明確的,因爲int類型的左值可以很好地綁定到int和int。 – 2012-03-25 14:08:59

2

你可以說f(static_cast<const int &>(a)>)強制使用int過載。非const重載不能用的說法被消除歧義,但你可以投本身的功能:

static_cast<void(&)(int&)>(f)(a); 

(當然,你總是可以選擇特定的過載手動這樣的,所以這並不是真正的「重載」任何更多)

相關問題