【发布时间】:2014-02-17 23:02:10
【问题描述】:
与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 参数调用并且不返回任何内容,而第二个模板中的“F”是指向此类“某物”的指针,并且在这两种实现中,F 的使用方式与直接使用函数名和通过函数指针使用函数名时的使用方式相同。 我认为这与函数名称如何衰减为指针密切相关,但我对标准的哪一部分对此进行了形式化有点困惑。
【问题讨论】:
标签: c++ templates function-pointers