7

トピックのタイトルは長くてわかりにくいですが、質問はかなり単純です。

14.8.1 Explicit template argument specification最新のC++11仕様ドラフト(N3242 = 11-0012)、375ページを読んでいます

6パラメーター型にテンプレート引数の推定に関与するテンプレートパラメーターが含まれていない場合、関数引数に対して暗黙の変換(条項4)が実行され、対応する関数パラメーターの型に変換されます。[注:テンプレートパラメーターは、明示的に指定されている場合、テンプレート引数の推定には関与しません。例えば、

template<class T> void f(T);
class Complex {
  Complex(double);
};
void g() {
  f<Complex>(1); // OK, means f<Complex>(Complex(1))
}

—エンドノート]

誰かが私に、それが何を言おうとしているのか、そして例で起こっている変換はどこにあるのかを説明してもらえますか?
ありがとう !

4

1 に答える 1

6

変換はここで行われます:

f<Complex>(1);

fを期待する関数を呼び出してComplexいますが、代わりにそれを渡していますint。からへの標準変換とからintdoubleユーザー定義の変換があります。doubleComplex

標準が言おうとしているのは、テンプレート関数にテンプレート引数を明示的に指定すると、それらは関数がそれらの型で宣言されているかのように動作するということです。つまり、呼び出すf<Complex>と、宣言されているかのように動作します。

void f( Complex );

そうでなければ、テンプレートパラメータが明示的に指定されていなかった場合、そのTように推定されint、暗黙的な変換は行われませんでした。

于 2012-12-26T04:55:50.570 に答える