2016-09-04 9 views
6

次のコードprints "func 2"オーバーロードの解像度と明示的なテンプレート引数

明示的(推論されていない)テンプレート引数があると、コンパイラは2番目のテンプレートをより適切に扱うのはなぜですか?なぜあいまいさがないのですか?

C++標準から引用していただきたいと思います。

#include <iostream> 

template<class T> 
struct identity 
{ 
    typedef T type; 
}; 

template<class T> 
void func(T) 
{ 
    std::cout << "func 1\n"; 
} 

template<class T> 
void func(typename identity<T>::type) 
{ 
    std::cout << "func 2\n"; 
} 

int main() 
{ 
    func<int>(1);  
} 

答えて

3

どちらの候補者は生存可能であり、同じ引数を取るので、オーバーロードの解決プロセスはバック最後のタイブレークにフォール:関数テンプレート[temp.func.order]の一部の順序付け。

テンプレートの種類ごとに新しいタイプを合成し、お互いのオーバーロードに対して控除を試みるというルールです。 1については、タイプUnique1を合成します。これは、Tが推論できないコンテキストなので、2での控除に失敗します。 2については、タイプUnique2を合成します。これは、T = typename identity<Unique2>::typeの推定に成功します。控除は一方向で成功し、他方では成功しないので、21よりも専門になります。

テンプレートの部分順序規則は、標準では多少不完全であることに注意してください。タイプTの別の引数を単に追加する場合は、優先度はflipsです。

関連する問題