C 中基於形參是否為引用的過載(奇怪的過載)

2021-08-14 15:05:18 字數 789 閱讀 4113

無意間發現,根據形參是否為引用的不同,也可以實現過載,但是呼叫時會出問題.

比如下面的**

[cpp]view plain

copy

void

f(int

i)  

void

f(int

& i)  

intmain()    

編譯器報呼叫二義(ambiguous)的錯誤,如果傳乙個常量,則會呼叫f(int)的版本,比如呼叫f(2);

原因是如果傳int型的變數,會由於兩個都是精確匹配因此產生二義,而如果本身不是個int型別,而是其他的比如double型別,則會產生乙個臨時變數賦給整型形參,但臨時變數不能被賦給整型的引用,所以

會只匹配不是引用的那個版本

然後,我就好奇,如何才能呼叫到引用的版本呢,嘗試了幾個都仍然調的是非引用的版本,最後在stackoverflow上找到乙個方法,the resolution is a bit more tricky.

方法是利用強制轉型把函式f轉成引用的那個函式指標型別,即用

static_cast(f)(x);

去呼叫,平常一般都是想著把引數強制轉換,

第一次看到把函式強制轉換的,完全沒想到啊,不過貌似用c的強制型別轉化語法(即只加括號去強制轉型)也會不能成功。

不過如果這兩個函式是在類裡面,也就是說呼叫時在函式前還要加個物件,這個時候似乎就不能轉型了,會報語法錯,可能我寫法有問題,暫無解決方案。

C 中基於形參是否為引用的過載(奇怪的過載)

無意間發現,根據形參是否為引用的不同,也可以實現過載,但是呼叫時會出問題.比如下面的 void f int i void f int i int main 編譯器報呼叫二義 ambiguous 的錯誤,如果傳乙個常量,則會呼叫f int 的版本,比如呼叫f 2 原因是如果傳int型的變數,會由於兩個...

函式形參中的const引用

這裡將c primer中函式形參章節有關const和引用的問題簡單小結如下 一 非const非引用形參 這個是乙個平庸的情形。函式引數通過複製對應的實參實現初始化,函式本身對形參的修改不會影響到實參。傳遞給這類函式的實參可以是乙個const型的物件,也可以是非const的物件。乙個需要注意的事情是,...

C 使用引用形參的優點

c 使用引用形參的優點 在向函式傳遞大物件時,需要使用引用形參。雖然賦值實參對於內建資料型別的物件或者規模較小的類型別來說沒有什麼問題,但是對於大部分的類型別或者大型陣列,它的效率就比較低了。另外,某些類型別是無法複製的。使用引用形參,函式可以直接訪問實參物件,而無須複製它。示例 bool issh...