函数调用null对象时返回的布尔值 < P>在C++中空对象上调用函数时返回的布尔值是什么? ClassDummy* dummy = NULL; if (!dummy->dummy_function(1,2,3)) { // Do Something }

函数调用null对象时返回的布尔值 < P>在C++中空对象上调用函数时返回的布尔值是什么? ClassDummy* dummy = NULL; if (!dummy->dummy_function(1,2,3)) { // Do Something },c++,c++11,C++,C++11,根据C++11标准,这不应该返回错误吗?通过空指针调用方法具有未定义的行为。代码无效,但编译器不需要告诉您它是无效的 C++标准定义了许多情况,即使代码无效,编译器也不需要给出“诊断”。在许多情况下,原因仅仅是编译器很难确定代码是否有效。在您的特定代码中,这非常简单,如果使用适当的警告级别,某些编译器实际上可能会发出警告。然而,构建一个更复杂的示例并不太困难,因为编译器不容易判断指针是否为null。在编译器不需要给出诊断之前,准确地标准化代码的复杂程度将是困难的,而且可能是毫无意义的,因此这取

根据C++11标准,这不应该返回错误吗?

通过空指针调用方法具有未定义的行为。代码无效,但编译器不需要告诉您它是无效的


C++标准定义了许多情况,即使代码无效,编译器也不需要给出“诊断”。在许多情况下,原因仅仅是编译器很难确定代码是否有效。在您的特定代码中,这非常简单,如果使用适当的警告级别,某些编译器实际上可能会发出警告。然而,构建一个更复杂的示例并不太困难,因为编译器不容易判断指针是否为null。在编译器不需要给出诊断之前,准确地标准化代码的复杂程度将是困难的,而且可能是毫无意义的,因此这取决于每个实现来做出决定。

在原始问题
dummy
中有一个未指定的值,可能是null。但是,编辑后的效果没有改变:行为是。这不是任何工具都需要检测的错误:程序员的任务是仅对有效对象调用成员函数。

除非在命名空间范围内声明了
dummy
,否则它是未初始化的,并且它的值未指定,即它可能是空的,也可能不是空的。对
nullptr
或指向无效内存的指针调用成员函数是未定义的行为

如果您调用的成员函数不访问该类的任何其他数据成员,您可能会这样做;换句话说,如果它没有取消引用
这个
指针。但是,无论您是否获得了预期的结果,它仍然是未定义的行为


编译器不需要检测此类无效函数调用。如果您执行了一些明显的操作,例如初始化指向
nullptr的对象指针,然后调用其上的成员函数,您可能会看到编译器的诊断,但这并不能保证。

尝试这样取消对空指针的引用将导致未定义的行为


(通常,大多数系统上都存在内核转储或内存访问异常。)

调用非静态成员函数和访问非静态成员变量会产生错误

一些编译器和运行时环境允许使用带有空指针的
静态
成员变量和成员函数,但根据标准,这仍然是未定义的行为


有关更多详细信息,请参阅和已接受的答案。

我对问题做了一些更改。如果指针显式标记为NULL,是否会出现错误?否。还是一样。。。如果你需要澄清的意思:遵循链接@迪特马克损坏,哇,我喜欢那个。并且回答你的未来“不应该C++告诉我我做了一些错误”的问题提前:不。C++对你的程序工作的情况进行了优化,在你有bug的情况下几乎什么也不说。如果调用了一个不访问
*this
的非虚拟成员函数,它通常会默默地工作。@hvd无论如何,这是邪恶的。