何时在空实例上调用成员函数会导致 C++11 中的未定义行为? [复制]

Posted

技术标签:

【中文标题】何时在空实例上调用成员函数会导致 C++11 中的未定义行为? [复制]【英文标题】:When does invoking a member function on a null instance result in undefined behavior in C++11? [duplicate] 【发布时间】:2013-01-07 12:51:52 【问题描述】:

可能重复:When does invoking a member function on a null instance result in undefined behavior?

我刚刚读到这个问题,答案很好:When does invoking a member function on a null instance result in undefined behavior?

基本上,下面的代码是未定义的行为吗?

struct foo  static void bar()   ;
foo *p = nullptr;
p->bar();

根据链接的帖子,这可以用不同的方式解释,一种是 UB,另一种不是。

在 C++0x 中,从 n3126 开始,歧义仍然存在

这在最终的 C++11 中仍然成立吗?

【问题讨论】:

引用链接问题中的答案:“通过空指针调用成员函数总是未定义的行为”。 仅仅因为它可能被允许并不意味着你应该这样做。 @helami 你误读了你链接的帖子。 @Yakk:怎么会这样?他想知道这些答案在 C++11 中是否仍然正确。 @Non-StopTimeTravel:Jame's McNellis comment 已经回答了。 【参考方案1】:

您链接的问题清楚地表明,无论是对标准的严格解释还是弱解释,您显示的代码都是未定义的行为。歧义(可能)仅存在于静态函数(您的问题专门针对非静态函数)。

编辑:2012 年 1 月 16 日的N3337 中仍然存在歧义,但我没有最终标准的副本。根据问题中的 cmets,问题 232 的决议似乎从未将其纳入标准,显然是因为措辞过于强烈,使其成为编译时概念而不是预期的未定义行为。

【讨论】:

问题已更改,现在指的是static函数。

以上是关于何时在空实例上调用成员函数会导致 C++11 中的未定义行为? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

java中静态成员变量、实例变量、局部变量何时创建、何时销毁?

成员函数中的静态变量

C函数中如何调用未实例化类的成员函数

我可以举一个现实生活中的例子,其中非静态成员函数不访问通过空指针调用的对象会导致可观察到的问题吗? [复制]

致命错误:未捕获的错误:在 null 上调用成员函数 select()

Java中的构造函数Constructor怎么用