如果不调用未定义的行为,这怎么能== nullptr?

时间:2018-02-04 22:59:07

标签: c++ this undefined-behavior dereference nullptr

我最近正在阅读Programming: Principles and Practice Using C++ (2nd Edition),我在函数中找到了这个片段,用于插入链接列表(页619):

if (n==nullptr) return this;
if (this==nullptr) return n;

第一次检查似乎很好,但第二次检查对我来说非常混乱。我立即想到的问题是this == nullptr 如何},如果对象被实例化为{{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是否可以成立?

[GCC]

0 个答案:

没有答案