C++ C++;从空指针调用非虚拟非静态方法,而不访问成员:这能保证工作吗?

C++ C++;从空指针调用非虚拟非静态方法,而不访问成员:这能保证工作吗?,c++,function,pointers,null,member,C++,Function,Pointers,Null,Member,我可以从空指针调用类的非静态、非虚拟方法吗?然后,成员函数将测试this==nullptr,如果为true,则立即返回 我知道它在大多数情况下都会起作用,但这是一个有保证的结果吗?这样,我可以确保空指针异常永远不会发生,并避免在调用方代码的许多地方测试空指针。这是为了紧凑性,我现在不打算这么做,但我很想知道是否有任何标准可以保证这一点 谢谢 取消对nullptr的引用是未定义的行为。句号 它是否在一个特定的实现上工作是不相关的,行为是不能保证的。取消引用nullptr是未定义的行为。句号 无论它

我可以从空指针调用类的非静态、非虚拟方法吗?然后,成员函数将测试this==nullptr,如果为true,则立即返回

我知道它在大多数情况下都会起作用,但这是一个有保证的结果吗?这样,我可以确保空指针异常永远不会发生,并避免在调用方代码的许多地方测试空指针。这是为了紧凑性,我现在不打算这么做,但我很想知道是否有任何标准可以保证这一点


谢谢

取消对
nullptr
的引用是未定义的行为。句号

它是否在一个特定的实现上工作是不相关的,行为是不能保证的。

取消引用
nullptr
未定义的行为。句号

无论它是否在一个特定的实现上工作,都是不相关的,这种行为是不能保证的。

标准明确提到取消引用空指针是未定义的行为。使用Operator->取消指向左侧的指针的引用

所以,只有在您的实现为案例定义了一些行为的情况下,您才可以,因为这是一种可能性(尽管我在现实生活中还从未遇到过)


(我希望您理解,观察某些东西与定义不同。)

标准明确提到取消引用空指针是未定义的行为。使用Operator->取消指向左侧的指针的引用

所以,只有在您的实现为案例定义了一些行为的情况下,您才可以,因为这是一种可能性(尽管我在现实生活中还从未遇到过)


(我希望您理解,观察某事物与定义不同。)

始终避免调用空指针,
通常会导致核心转储

始终避免调用空指针,
您通常会得到一个核心转储

这里有一些有趣的答案:

此外,该标准没有给出关于调用成员虚拟函数的机制的提示。通常通过将“this”作为隐藏函数参数传递来完成,这在实践中不会取消对指针的引用并起作用。然而,似乎可以使用vtable实现非虚拟函数,在这种情况下,vtable会崩溃

有趣的是,Microsoft函数依赖于以下行为:)
这里有一些有趣的答案:

此外,该标准没有给出关于调用成员虚拟函数的机制的提示。通常通过将“this”作为隐藏函数参数传递来完成,这在实践中不会取消对指针的引用并起作用。然而,似乎可以使用vtable实现非虚拟函数,在这种情况下,vtable会崩溃

有趣的是,Microsoft函数依赖于以下行为:)

不,这是一种未定义的行为。为什么我们会投票否决提出明确问题的人?Asker想知道未定义的行为,并且正在询问它,它的措辞甚至与提议的可能重复的行为截然不同@Sqeaky-Plus,其2014和标准已经修订。因此,前面的答案甚至可能不适用。它的经典之作是在顶部撒上一点“我知道的比你多”。不,它保证了未定义的行为。为什么我们会投票否决提出明确问题的人?Asker想知道未定义的行为,并且正在询问它,它的措辞甚至与提议的可能重复的行为截然不同@Sqeaky-Plus,其2014和标准已经修订。因此,前面的答案甚至可能不适用。虽然我同意你的答案,但问题是关于“保证”行为的:在现实生活中,它有时会起作用,如果你必须处理一些依赖于这些东西的代码(或者更复杂的UB案例),那么在测试之后会有很多细节“句号!“…这就是说明。请引用你的参考资料!否则就不能保证相信答案。@galinette:这是最常见和基本已知的未定义行为用例。如果你不知道这一基本事实,那么你就急需一本好书。不,我不会为这样一个琐碎的案例召唤神圣的标准。@anxieux:B发生从标准的角度来看,行为是未定义的,因此没有必要试图找到有意义的结论,特别是当没有提到具体的编译器实现时。我喜欢权威:)尽管我同意你的答案,问题是关于“保证”行为:在现实生活中,它有时会起作用,如果你必须处理一些依赖于这些东西的代码(或者更复杂的UB案例),在“Period!”之后会有很多细节……这就是说明。请引用你的推荐信!否则就不能保证相信答案。@galinette:这是最常见的、基本上已知的未定义行为用例。如果你不知道这个基本事实,那么你急需一本好书。不,我不会为这样一个琐碎的案例召唤神圣的标准。@anxieux:一旦UB发生,行为从标准的角度来看是不确定的,所以没有必要试图找到有意义的结论,特别是在没有提到具体的编译器实现的情况下。我肯定会避免它。。。事实上,了解成员函数的机制(“this”只是作为隐藏的第一个参数传递给其他静态函数),我只是想知道该行为在标准中是如何定义的。我肯定会避免它。。。事实上,了解成员函数的机制(“this”只是作为隐藏的第一个参数传递给其他静态函数),我只是想知道