我最近正在阅读Programming: Principles and Practice Using C++ (2nd Edition),我在函数中找到了这个片段,用于插入链接列表(页619):
if (n==nullptr) return this;
if (this==nullptr) return n;
第一次检查似乎很好,但第二次检查对我来说非常混乱。我立即想到的问题是this == nullptr
如何1>},如果对象被实例化为{{this
只会等于nullptr
1}}。由于此代码段位于成员函数中,因此必须取消引用空指针才能访问它,即undefined behavior。为了证实这一点,我创建了一个小片段:
nullptr
就像我预期的那样,只有当指针未被初始化时,如第一种情况一样(实际上这里没有预期),或者当它被设置为#include <iostream>
class Test
{
public:
Test() = default;
void checkSelf()
{
if (this == nullptr)
{
std::cout << "This was nullptr.\n";
}
else
{
std::cout << "This was not nullptr.\n";
}
}
};
int main()
{
Test* test; // Uninitialized pointer
test->checkSelf(); // Outputs 'This was nullptr.'
Test* test2 = nullptr;
test2->checkSelf(); // Outputs 'This was nullptr.'
Test* test3 = new Test{}; // Outputs 'This was not nullptr.'
test3->checkSelf();
delete test3;
}
时,如第二种情况那样,检查评估为{ {1}}在成员函数内部。但是,由于两个这样的例子都是未定义行为的例子,因此在一个结构良好的程序中检查是否正确是没有意义的。因此,如果不调用UB,检查nullptr
是否可以成立?