在C ++中对空对象进行函数调用时返回的布尔值是什么?
ClassDummy* dummy = NULL;
if (!dummy->dummy_function(1,2,3)) {
// Do Something
}
根据C ++ 11标准,这不应该返回错误吗?
答案 0 :(得分:5)
除非在命名空间范围内声明dummy
,否则它未初始化且其值未指定,即它可能为空,也可能不为空。在nullptr
或指向无效内存的指针上调用成员函数是未定义的行为。
如果您调用的成员函数不访问该类的任何其他数据成员,您可以get away with the correct result;换句话说,如果它没有取消引用this
指针。但是,无论您是否获得预期结果,它仍然是未定义的行为。
编译器不需要检测此类无效函数调用。如果你做了一些明显的事情,比如初始化一个指向nullptr
的对象指针,然后在其上调用一个成员函数,你可能会看到编译器的诊断,但这不能保证。
答案 1 :(得分:4)
在原始问题dummy
中有一个未指定的值,可能为null。但是,编辑后的效果不会更改:行为为undefined。检测不需要任何工具:程序员只能在有效对象上调用成员函数。
答案 2 :(得分:2)
通过空指针调用方法具有未定义的行为。代码无效,但编译器不需要告诉您它是。
C ++标准定义了许多情况,即使代码无效,编译器也不需要提供"诊断"。在许多情况下,原因仅仅是因为编译器很难确定代码是否有效。在您的特定代码中,这非常简单,如果您使用正确的警告级别,某些编译器实际上可能会发出警告。但是,构建一个更复杂的例子并不困难,因为编译器不能轻易判断指针是否为空。在编译器不需要提供诊断之前准确标准化代码的复杂程度将是困难的,并且可能毫无意义,因此只需要每个实现做出决定。
答案 3 :(得分:2)
尝试取消引用这样的空指针将导致未定义的行为。
(通常,大多数系统上的核心转储或内存访问异常。)
答案 4 :(得分:0)
调用非静态成员函数并访问非静态成员变量应该会产生错误。
某些编译器和运行时环境允许使用带有NULL指针的static
成员变量和成员函数,但根据标准,这仍然是未定义的行为。
有关更多详情,请参阅C++ static const access through a NULL pointer和接受的答案。