为什么我的函数指针代码运行没有错误?

时间:2010-09-30 06:48:17

标签: c++ pointers function

我有这个:

typedef void (*funcptr) (void);

int main(){

    funcptr(); //this can compile and run with no error . WHAT DOES IT MEAN? WHY NO ERRORS?


}

3 个答案:

答案 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的函数。然后,您正在创建它的实例,但没有标识符,则丢弃它。