c ++模板调用函数指针类型

Udo*_*ein 7 c++ templates

如果我有类型的声明

typedef void (*command)();

template <command c>
void execute() {
   c();
}

void task() { /* some piece of code */ }
Run Code Online (Sandbox Code Playgroud)

然后

execute<task>();
Run Code Online (Sandbox Code Playgroud)

将按预期编译和运行.但是,如果我将模板定义为

template <command c>
void execute() {
   command();
}
Run Code Online (Sandbox Code Playgroud)

它仍然编译.我偶然做到了这一点.现在我对第二个版本应该做什么感到困惑.

650*_*502 8

在C++中

type_name()
Run Code Online (Sandbox Code Playgroud)

是一个表达式,用于创建默认初始化的实例type_name.

对于本机类型,存在隐式定义的默认构造函数,例如

int();
Run Code Online (Sandbox Code Playgroud)

是一个有效的C++语句(只是创建一个int并抛出它).

g++ 发出完整警告,发出诊断消息,因为它是一个可疑(可能是非预期的)操作,但代码是有效的,甚至可以有程序取决于它(如果类型是用户定义的类型,并且实例的构造函数有侧效果).