如果我有类型声明,如
typedef void (*command)();
template <command c>
void execute() {
c();
}
void task() { /* some piece of code */ }
然后
execute<task>();
将按预期编译和运行。但是,如果我将模板定义为
template <command c>
void execute() {
command();
}
它仍在编译中。我偶然做到了这一点。现在我对第二个版本的预期感到困惑。
答案 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.