默认vs Deduced模板参数?

时间:2012-11-30 03:34:52

标签: c++ c++11 templates standards-compliance template-deduction

以下内容:

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:默认参数为优先级:转换构造函数MyClass<Type>(const MyClass<OtherType>& x)被隐式调用,并调用MyClass<Type>::test<Type>(const MyClass<Type>& x)

案例2:推断出的参数是优先级:调用MyClass<Type>::test<Type>(const MyClass<OtherType>& x)


我认为第二个好答案,但我不确定。你能否证实我(并且这种情况是由标准明确定义的)?


编辑:测试函数由:

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

1 个答案:

答案 0 :(得分:2)

test将被称为

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

即。不会将uiMyClass<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)
}
     

- 结束示例]