我有这个:
typedef void (*funcptr) (void);
int main(){
funcptr(); //this can compile and run with no error . WHAT DOES IT MEAN? WHY NO ERRORS?
}
答案 0 :(得分:14)
该语句通过其默认构造函数*创建funcptr
实例并将其丢弃。
它与代码
类似int main () {
double();
}
(注意:*从技术上讲,它执行 default-initialization ,因为并非所有类型都有构造函数。这些类型将返回默认值(零初始化),例如,有关实际发生的情况,请参阅C ++98§5.2.3/ 2和§8.5/ 5.)
答案 1 :(得分:5)
在C ++语言中,some_type()
形式的任何表达式都会创建类型为some_type
的值。值为值初始化。
例如,表达式int()
创建类型int
的值初始化值。 int
的值初始化意味着零初始化,这意味着int()
计算编译时整数零。
在你的例子中也会发生同样的事情。您创建了类型funcptr
的值初始化值。对于指针类型,值初始化意味着使用空指针初始化。
(另请注意,表示像int()
,double()
这样的表达式或OP中具有非类型类型的表达式使用“默认构造函数”是完全错误的。非类型类型具有没有构造函数。非类类型的初始化的概念是由语言规范定义的,不涉及任何“构造函数”。)
换句话说,你并不是真的在代码示例中“使用函数指针”。您正在创建一个空函数指针值,但是您没有对它执行任何其他操作,这就是代码不会出现任何问题的原因。如果你想尝试通过该函数指针进行调用,它将看起来如下funcptr()()
(注意两对()
),这段代码肯定会崩溃,因为这是一次尝试时通常会发生的情况通过空函数指针值调用。
答案 2 :(得分:1)
您正在定义一个数据类型funcptr,它是一个不带参数并返回void的函数。然后,您正在创建它的实例,但没有标识符,则丢弃它。