7

如果我有像这样的类型声明

typedef void (*command)();

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

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

然后

execute<task>();

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

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

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

4

2 回答 2

8

在 C++ 中

type_name()

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

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

int();

是一个有效的 C++ 语句(只是创建一个int并将其丢弃)。

g++带有完整警告会发出诊断消息,因为它是可疑(可能是意外)操作,但代码是有效的,甚至可以有依赖于它的程序(如果类型是用户定义的类型并且实例的构造函数有边影响)。

于 2013-10-27T07:13:58.633 回答
4
command();

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

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

您应该打开-Wall编译器的选项。实时代码。

于 2013-10-27T07:11:24.143 回答