【问题标题】:Checking whether (this == nullptr) in a class method [duplicate]检查类方法中是否(this == nullptr)[重复]
【发布时间】:2018-10-01 08:30:30
【问题描述】:

我想像这样替换代码:

if ((obj != nullptr) && obj->is_valid())

if (obj->is_valid())

在哪里

class Obj {
    bool is_valid() {
        if (this == nullptr)
            return false;
        // some more logic ...
    }
    ...
};

显然有2个条件:

  1. obj 总是通过指针访问
  2. Obj::is_valid() 永远不是虚拟的

这是基于这样一个事实,即非虚拟方法接受 this 作为其第一个参数,因此

obj->is_valid();

改写为

Obj::is_valid(obj);

虽然此代码在 gcc-5.4.0 中按预期工作,但我的问题是这是否是合法的 C++ 代码,是否会被其他(旧/新)C++ 编译器正确解释/优化?

【问题讨论】:

  • 它几乎可以在任何地方做你期望它做的事情(至少没有任何优化),但不能保证,因为它是未定义的行为。
  • @Blaze 它不会在启用优化的较新版本的 gcc 上。这就是为什么答案属于答案部分,而不是 cmets,所以我们可以否决这样的错误信息。
  • 谢谢,我忘了优化。我会把它添加到评论中。

标签: c++ null


【解决方案1】:

不要。

if (this == nullptr)

首先它不会像calling a member function (method) on a null pointer is undefined behavior 那样提供任何安全性。这带来了一种没有安全感的安全感,这比没有更糟糕。

【讨论】:

  • 我在cppreference: Null pointers 上发现了这个:取消引用空指针是未定义的行为
  • 在阅读(并赞成)您的答案时,我正在寻找类似“权威”来源的东西......(并认为,提供我找到的 cppreference 的链接可能是值得的)。
猜你喜欢
  • 2016-01-16
  • 2018-04-28
  • 1970-01-01
  • 1970-01-01
  • 2012-02-09
  • 1970-01-01
  • 2019-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多