2013-02-02 6 views
18

私はこのコードを持っていますか?私はそれらが同じであると思うだろうが、私は再定義の誤りがないので、明らかにそうではない。「同じシグネチャ」のテンプレートと非テンプレート関数のオーバーロードが非テンプレート関数を呼び出すのはなぜですか?</p> <pre><code>template< class T = const int & > void f(T) {} void f(const int &) {} int main() { f(0); } </code></pre> <p>は、なぜそれが二番目の代わりに、最初の呼び出しん:

+2

http://stacked-crooked.com/view?id=f9aac9532f21077433027f9ae341417bここでは番号2を呼び出します。 – Rapptz

+0

@Rapptzはい、編集しました。 – user2030677

答えて

19

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

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

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

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

+1

それからちょっとした質問として、あなたはなぜ[これは#2を呼びますか?](http://stacked-crooked.com/view?id=f9aac9532f21077433027f9ae341417b)に答えることができました。 – Rapptz

+0

@Rapptz:#2はテンプレートではないからです。何か不足していますか? –

+0

読解力は少し離れています。 – Rapptz

6

1つはテンプレートであり、もう1つはテンプレートではないitely同じではありません。

オーバーロードの解像度は、テンプレート化された関数よりもテンプレート以外のものが優先されるように設計されています。

関連する問題

 関連する問題