簡體   English   中英

功能重載和模板扣除優先級

[英]Function overloading and template deduction priority

請考慮以下函數聲明:

template<typename T> f(const T& x); // Version 1
template<typename T1, typename T2> f(const MyClass<T1, T2>& x); // Version 2

如果我使用與MyClass無關的類型調用f ,則將調用第一個版本。 如果我用MyClass類型調用f (無論模板參數類型是什么),那么將調用第二個版本。 但現在,請考慮:

template<typename T1, typename T2, typename T3>
MyDerivedClass : public MyClass<T1, T2> {};

將為MyDerivedClass類型調用什么版本的函數?

這在標准的第13.3節中處理。 第13.3 / 1段指出:

這些上下文中的每一個都以其自己獨特的方式定義候選函數集和參數列表。 但是,一旦確定了候選函數和參數列表,最佳函數的選擇在所有情況下都是相同的: - 首先,候選函數的子集 - 具有適當數量的參數並滿足某些其他條件的函數 - 被選中以形成一組可行的函數(13.3.2)。 - 然后根據將每個參數與每個可行函數的相應參數匹配所需的隱式轉換序列(13.3.3.1)來選擇最佳可行函數。

第一個是更好的匹配,因為它不涉及任何隱式轉換。

暫無
暫無

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

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