我正在使用此处列出的资源学习C++模板。特别是,请阅读模板参数推导。现在,在阅读之后,为了进一步理清我对这个主题的概念,我尝试了以下例子,该例子在gcc中编译,但在clang和msvc中没有。演示
template<typename T = int> void f()
{
}
template<typename T> void func(T)
{
}
int main()
{
func(f); //works in gcc but not in clang and msvc
func(f<>); //works in all
}
正如我们所看到的,上面的例子在gcc中编译得很好,但在clang和msvc中编译不好我的问题是根据最新标准,这里有哪个编译器
这是CWG 2608,程序格式良好,因此gcc在接受程序时是正确的。
从由于cwg 2608而添加的temp.arg.explicit#4,可以使用默认模板参数,并且可以省略空模板参数列表<>
。
如果所有模板参数都可以推导出来,或者可以从默认模板参数中获得,那么它们都可以省略;在这种情况下,空模板参数列表<gt;也可以省略其本身。
(强调矿(
请注意上面引用的语句中粗体突出显示的部分,这意味着在您的示例中可以省略空模板参数列表<>
,因为所有模板参数都可以从默认模板参数中获得。
此外,over.over#3在这里也可以用来查看从temp.arg.explicit生成的专业化被添加到重载集:
由模板参数推导([temp.over]、[temp.dexect.funcaddr]、[Ttemp.arg.extice](为每个命名的函数模板生成的专门化(如果有(将添加到所考虑的选定函数集。
(强调矿(
这意味着在最后,调用func(f);
是良好形式的,并使用生成的专门化f<int>
。