21

私はこのコードを持っています:

template<
    class T = const int &
> void f(T) {}

void f(const int &) {}

int main() {
   f(0);
}

最初の代わりに2番目のものを呼び出すのはなぜですか? 私はそれらが同じであると考えますが、再定義エラーが発生しないため、明らかにそうではありません。

4

2 に答える 2

24

2番目のオーバーロードはテンプレートではないためです。

テンプレート関数と非テンプレート関数の両方が関数呼び出しを解決するために実行可能である場合、非テンプレート関数が選択されます。

C++11標準のパラグラフ13.3.3/1から:

[...]これらの定義を前提として、すべての引数iについて、ICSi(F1)がICSi(F2)よりも悪い変換シーケンスではない場合、実行可能な関数F1は別の実行可能な関数F2よりも優れた関数であると定義されます。 ...] F1は非テンプレート関数であり、F2は関数テンプレートの特殊化です[...]

于 2013-02-02T20:34:08.003 に答える
7

1つはテンプレートで、もう1つはそうではありません。これらは、まったく同じではありません。

過負荷解決は、テンプレート化された関数よりも非テンプレートを優先するように設計されており、他のすべては同じです。

于 2013-02-02T20:35:12.027 に答える