【发布时间】: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个条件:
-
obj总是通过指针访问 -
Obj::is_valid()永远不是虚拟的
这是基于这样一个事实,即非虚拟方法接受 this 作为其第一个参数,因此
obj->is_valid();
改写为
Obj::is_valid(obj);
虽然此代码在 gcc-5.4.0 中按预期工作,但我的问题是这是否是合法的 C++ 代码,是否会被其他(旧/新)C++ 编译器正确解释/优化?
【问题讨论】:
-
它几乎可以在任何地方做你期望它做的事情(至少没有任何优化),但不能保证,因为它是未定义的行为。
-
@Blaze 它不会在启用优化的较新版本的 gcc 上。这就是为什么答案属于答案部分,而不是 cmets,所以我们可以否决这样的错误信息。
-
谢谢,我忘了优化。我会把它添加到评论中。