没有尖括号可以调用模板化功能吗?

时间:2014-06-27 03:00:37

标签: templates c++11

我对在C ++ 11中调用模板化函数需要什么感到困惑,其中为模板参数提供了默认值。

例如,假设我有以下模板化函数

template <class T = double> void foo()
{
  /* Do something */
}

我想在我的代码中的某个地方调用它。所有这些有效的电话都是吗?

foo(); //Is this OK?
foo<>();
foo<int>();

它与GCC 4.7.2编译良好,但我不确定它是否严格正确的C ++。我想我的不确定性可能来自于使用默认模板创建模板化类的实例时使用空尖括号<>的要求,如下所述:

Template default arguments

但我认为在我的情况下,函数括号()是关键区别吗?

1 个答案:

答案 0 :(得分:8)

对函数模板的函数调用,其中每个模板参数都是可推导的或具有默认值,可以使用空尖括号或者可以省略它们,两种方式都有效。

不同之处在于,如果省略尖括号,则会邀请重载解析来考虑恰好命名为foo的非模板函数,并且恰好可以使用相同的函数调用(在这种情况下为空) )参数列表。

这在C ++ 11中没有改变。