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

时间:2013-10-27 07:04:27

标签: c++ templates

如果我有类型声明,如

typedef void (*command)();

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

void task() { /* some piece of code */ }

然后

execute<task>();

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

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

它仍在编译中。我偶然做到了这一点。现在我对第二个版本的预期感到困惑。

2 个答案:

答案 0 :(得分:8)

在C ++中

type_name()

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

对于natives类型,有隐式定义的默认构造函数,例如

int();

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

带有完全警告的

g++会发出诊断消息,因为它是一个可疑(可能是非预期的)操作,但代码有效,甚至可能有程序依赖它(如果类型是用户定义的类型并且实例的构造函数有副作用。)

答案 1 :(得分:4)

command();

它创建一个临时对象,如TYPE();,编译器将其省略为未使用的变量。

warning: statement has no effect [-Wunused-value]
     command();
     ^

您应该打开-Wall编译器的选项。 Live code.