如果我有类型的声明
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)
它仍然编译.我偶然做到了这一点.现在我对第二个版本应该做什么感到困惑.
在C++中
type_name()
Run Code Online (Sandbox Code Playgroud)
是一个表达式,用于创建默认初始化的实例type_name.
对于本机类型,存在隐式定义的默认构造函数,例如
int();
Run Code Online (Sandbox Code Playgroud)
是一个有效的C++语句(只是创建一个int并抛出它).
g++ 发出完整警告,发出诊断消息,因为它是一个可疑(可能是非预期的)操作,但代码是有效的,甚至可以有程序取决于它(如果类型是用户定义的类型,并且实例的构造函数有侧效果).