いいえ、それは役に立たないでしょう。
NULL
ポインターでメンバー関数を呼び出すと、未定義の動作が呼び出されます。名前が示すように、この時点で動作を確認することはできません。
具体的には:
void MyObject::foo() {
if (this) { throw std::logic_exception("this is NULL"); }
std::cout << "Hello, world!\n";
}
準拠するコンパイラによって次のように合理的に変更できます。
void MyObject::foo() {
std::cout << "Hello, world!\n";
}
結局のところ、標準this
は が最初から null にならないことを保証しているからです!
ただし、できることは、「生の」ポインターに依存することではありません。
template <typename T>
class Pointer {
public:
Pointer(): _ptr(nullptr) {}
Pointer(T* t): _ptr(t) {}
T* operator->() const { assert(_ptr); return _ptr; }
T& operator*() const { assert(_ptr); return *_ptr; }
private:
T* _ptr;
};
そして、ポインターのように使用します。
int main() {
Pointer<MyObject> value = container.find("Element");
value->foo();
}
foo
null の場合は、への呼び出しが試行される前にアサートが発生します。