与Syntax of C++ templates with function type parameters有些相关但无法消除我在那里的所有怀疑。
之间的区别是什么?
template <void F(int)>
void fun1 (int a) {F(a);}
和
template <void (*F)(int)>
void fun2 (int a) {F(a);}
我尝试用
之类的东西进行实例化void called (int arg)
{
...
}
int main()
{
fun1(10);
fun2(20);
return 0;
}
查看clang 3.4和gcc-4.8(两者都是-O0)生成的汇编代码,我看不出有任何区别。
我知道函数的名称在作为参数传递时会衰减到指向其类型的指针,但是无法找到在上面模板实例化期间使用它时会发生什么的明确解释。 我会说第一个模板中的“F”是可以使用int参数调用的“something”类型并且不返回任何内容,而第二个模板中的“F”是指向这样“某事”的指针,并且在两个实现中,F可以以与直接和通过函数指针使用函数名称的情况相同的方式使用。 我认为这与函数名称如何衰减成指针严格相关,但我对标准的哪一部分形式化这一点感到有点困惑。
答案 0 :(得分:3)
类型为“
T
数组”或“函数返回T
”的非类型模板参数被调整为类型 “指向T
的指针”或“指向函数返回T
的指针”。
[C ++ 11标准,第14.1节[temp.param],第8段]