我正在尝试将模板化的函数传递给另一个函数,如下所示:
template<typename T = bool>
void fun() {}
template<typename F>
void higher_order_fun( const F & f) {
f();
}
int main () {
//higher_order_fun(fun<>); //works
higher_order_fun(fun);
}
在gcc10.2
我能够通过fun
(模板原型)以同样的方式指定类型fun<>
。
请注意,如果我没有默认的模板参数T = bool,这将不起作用。
在Clang11
这不起作用。
参见https://godbolt.org/z/9WfMdc。
这里发生了什么?
以下所有标准参考文献均引用N4659:2017年3月Kona工作草案/ C ++ 17 DIS。
可以说这是一个GCC错误(/扩展功能),尽管我找不到它的票证。
根据[temp.names] / 1,您可以通过template-id引用模板专业化。后者的语法不允许省略尖括号,即使其中的template-argument-list可能为空(opt):<>
模板专业化可以通过template-id来引用:
simple-template-id: template-name < template-argument-list_opt > template-id: simple-template-id operator-function-id < template-argument-list_opt > literal-operator-id < template-argument-list_opt >
在您的情况下,您要引用fun<bool>
函数模板的专业化fun
,这与您可以通过将默认模板参数用于的单一类型模板参数来引用的专业化相同fun
,即as fun<>
。但是,不能fun<bool>
仅通过指定fun
;来参考专业化。后者不涉及专业化,因此您的程序格式错误。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句