簡體   English   中英

重載解析如何與可變參數函數一起使用?

[英]How does overload resolution work with variadic functions?

假設我有這個程序:

#include <iostream>

int fun(...) {return 0;}

template <typename... Args>
int fun(const Args&...) {return 1;}

int fun(const double val) {return 2;}

int main()
{
  std::cout << fun(1,2,3) << fun(1) << fun(1.0);
  return 0;
}

該程序返回以下內容:

112

我理解為什么fun(1.0)會返回2 ,因為那是最接近的匹配函數候選者,但為什么前2個例子返回1

這個頁面( http://en.cppreference.com/w/cpp/language/overload_resolution )提供了函數重載規則的參考,但似乎沒有涵蓋可變參數。 我在哪里可以找到可變參數/模板可變函數的重載規則?

為什么前兩個例子返回1

C風格的可變參數函數總是最差的匹配(從技術上講,它涉及“省略號轉換序列”,它比任何標准或用戶定義的轉換序列都要糟糕)。 為了fun(1, 2, 3) ,使用可變參數函數模板,可以照常執行演繹,給出Args = intintint 這是完全匹配。

為了fun(1) ,可變參數函數模板再次獲勝,因為Args被推導為int並且我們再次具有完全匹配,這比調用fun(double)所需的浮點積分轉換更好。

我在哪里可以找到可變參數/模板可變函數的重載規則?

您鏈接的頁面已經涵蓋了您需要了解的有關C風格可變參數函數的信息:

1)標准轉換序列總是優於用戶定義的轉換序列或省略號轉換序列。

2)用戶定義的轉換序列總是優於省略號轉換序列

對於可變參數模板,實際上沒有任何特殊規則; 模板參數推導像往常一樣執行,然后應用通常的重載決策規則。

在這種情況下,規則變得更加復雜:

template <class... Args> int f(Args...) { return 1; }
template <class T> int f(T) { return 2; }
f(1); // returns 2

在這種情況下,通常的規則無法解決重載,但選擇第二個函數是因為它“更專業”。 確定一個功能模板何時比另一個更專業的規則(在我看來)很難理解。 您可以在C ++ 11標准的§14.5.6.2[temp.func.order]中找到它們。

暫無
暫無

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

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