簡體   English   中英

Function 在 c++ 中使用默認參數重載

[英]Function overloading with default parameter in c++

我的程序是:

class base {
    int a, b;
public:
    int add(int a, int b) {
        return a + b;
    }
    int add(int a, int b, int c=0 ){
        return a + b + c;
    }
};

int main() {

    base b;
    b.add(10, 20);//compilation error
    return 0;
}

我知道有歧義出現。 但我想知道編譯器如何處理帶有 function 重載的默認參數。 因為如果我不調用此 function 或調用 add(10,20,0) 它工作正常。

或者

對於 function 重載,它被視為 add(int,int),add(int,int, int) 因為它有 2 個不同的 function 簽名,但請詳細解釋其背后的邏輯。

這是它(過載解決方案)的工作原理:

16.3.2.1 從為給定上下文(16.3.1)構造的候選函數集中,選擇一組可行函數,通過比較參數轉換序列和相關約束(17.4.2)從中選擇最佳 function最適合 (16.3.3)。

16.3.2.2 首先,要成為可行的 function,候選 function 應具有足夠的參數以在數量上與列表中的 arguments 一致。 [...] 只有當 (m+1)-st 參數具有默認參數 (11.3.6) 時,具有超過 m 個參數的候選 function 才可行。 出於重載決議的目的,參數列表在右側被截斷,因此恰好有 m 個參數。

所以基本上,它們在重載解析期間具有相同的簽名。

您有兩個名為add的函數。 一個占用兩個 arguments,另一個占用三個 arguments。第二個函數的簽名始終是add(int, int, int) 它沒有兩個簽名。

只是如果你自己不給它第三個參數,它就會幫你填上。

當然,這只有在重載解析已經找到add(int, int, int)時才會發生; 正如您所發現的,在這種特殊情況下,編譯器不可能猜測您想要add哪個,但如果不是因為歧義,那么它會很簡單。 默認參數基本上是語法糖,對 function 的內部、它的簽名或它的錯位符號名稱沒有影響。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM