2

以下では :

template<typename Type>
struct MyClass
{
    template<typename OtherType> MyClass(const MyClass<OtherType>& x);
    template<typename OtherType = Type> void test(const MyClass<OtherType>& x);
};

関数test内で何が行われるか:

ケース 1 :デフォルトのパラメーターは priority です: 変換コンストラクターMyClass<Type>(const MyClass<OtherType>& x)が暗黙的に呼び出され、MyClass<Type>::test<Type>(const MyClass<Type>& x)呼び出されます。

ケース 2 :推定されたパラメーターが優先度の場合:MyClass<Type>::test<Type>(const MyClass<OtherType>& x)が呼び出されます。


良い答えは2番目だと思いますが、よくわかりません。(そして、この状況は標準によって明確に定義されていることを)確認できますか?


編集: テスト関数は次のように呼び出されます:

MyClass<double> d;
MyClass<unsigned int> ui;
d.test(ui); // <- So the question is : is ui implicitely 
            //    converted to MyClass<double> or not ?
4

1 に答える 1

4

testとして呼び出されます

MyClass<double>::test(const MyClass<unsigned int> &)

uiつまり、からMyClass<unsigned int>への変換はありませんMyClass<double>

デフォルトのテンプレート引数は、特定の引数をオーバーライドすることはありません。テンプレート引数が指定されておらず、コンパイラが関数の引数からそれを推測できない場合にのみ使用されます。

C++11 標準から:

(§14.8.2/5) 結果の置換および調整された関数型は、テンプレート引数推定の関数テンプレートの型として使用されます。テンプレート引数が推定されていない場合、デフォルトのテンプレート引数があればそれが使用されます。[ 例:

template <class T, class U = double>
void f(T t = 0, U u = 0);
void g() {
  f(1, ’c’);      // f<int,char>(1,’c’)
  f(1);           // f<int,double>(1,0)
  f();            // error: T cannot be deduced
  f<int>();       // f<int,double>(0,0)
  f<int,char>();  // f<int,char>(0,0)
}

— 終了例 ]

于 2012-11-30T03:50:14.170 に答える