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

Joh*_*nyy 4 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?


}
Run Code Online (Sandbox Code Playgroud)

ken*_*ytm 14

该语句funcptr通过其默认构造函数*创建一个实例并将其丢弃.

它与代码类似

int main () {
    double();
}
Run Code Online (Sandbox Code Playgroud)

(注意:*从技术上讲,它执行默认初始化,因为并非所有类型都有构造函数.这些类型将返回默认值(零初始化),例如0.参见C++98§5.2.3/ 2和§8.5/ 5 for究竟发生了什么.)

  • 不正确.只有类类型具有构造函数.非类类型没有构造函数.OP中的表达式以及`double()`表达式与任何构造函数完全无关.此表达式的结果由语言标准指定,不涉及任何构造函数. (3认同)

AnT*_*AnT 5

在C++语言中,表单的任何表达式some_type()都会创建一个type值some_type.该值已初始化.

例如,表达式int()创建一个值初始化的类型值int.值初始化int意味着零初始化,这意味着int()计算编译时整数为零.

你的例子中也会发生同样的事情.您创建了类型的值初始化值funcptr.对于指针类型,值初始化意味着使用空指针进行初始化.

(还要注意,这是绝对不正确的说,像表达式int(),double()或者一个与非类类型的OP使用"默认构造函数",非类类型没有构造函数.的概念初始化非类类型的由语言规范定义,不涉及任何"构造函数".)

换句话说,您并不是真正在代码示例中"使用函数指针".您正在创建一个空函数指针值,但您没有对它执行任何其他操作,这就是代码不会出现任何问题的原因.如果你想尝试通过该函数指针进行调用,它将如下所示funcptr()()(注意两对()),并且这段代码肯定会崩溃,因为当通过空函数指针值尝试调用时通常会发生这种情况.