函数调用返回null对象时返回的布尔值

ibp*_*p73 5 c++ c++11

在C++中对空对象进行fucntion调用时返回的布尔值是多少?

ClassDummy* dummy = NULL;
if (!dummy->dummy_function(1,2,3)) {
  // Do Something
}
Run Code Online (Sandbox Code Playgroud)

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

Pra*_*ian 5

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

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

编译器不需要检测此类无效函数调用.如果你做了一些明显的事情,比如初始化一个对象指针nullptr,然后在其上调用一个成员函数,你可能会看到编译器的诊断,但这不能保证.


Vau*_*ato 2

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

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