我想替换这样的代码:
if ((obj != nullptr) && obj->is_valid())
使用
if (obj->is_valid())
其中
class Obj {
bool is_valid() {
if (this == nullptr)
return false;
// some more logic ...
}
...
};
显然有两个条件:
obj
Obj::is_valid()
从来都不是虚拟的这是基于以下事实:非虚拟方法接受this
作为其第一个参数,因此
obj->is_valid();
被改写为
Obj::is_valid(obj);
虽然此代码可以在gcc-5.4.0上正常工作,但我的问题是这是否是合法的C ++代码,可以被其他(较旧/较新的)C ++编译器正确解释/优化?
答案 0 :(得分:6)
不要。
if (this == nullptr)
首先,它不会像calling a member function (method) on a null pointer is undefined behavior那样提供任何安全性。没有安全,这会带来安全感,这比没有要糟。