短い答え:だから、それをチェックするために、あなたはこのような何かを書くと、それが依存しています。
長い答え:まず、参照(myValueの型がT &のようなもの)と比較することはできません。また、割り当てられたオブジェクト(myValueがTの場合のみ)をnullにすることはできません。これらの型は常に割り当てられ、nullではありません。 (あなたがあなたのスタックを台無しにしたり、他の悪いことをしない限り - あなたがより大きな問題を持つよりも、これらのケースをチェックしません)。
nullをチェックできる唯一のタイプはポインタです(myValueはT *タイプのものです)。これらのタイプの場合:
- C++ 98を使用する場合は、0をチェックできます。通常、NULLはマクロ(#define NULL 0)です。
- 新しいC++ 11を使用している場合は、新しいnullptrキーワードがあります。これは、これに対してチェックする必要があります。
0はfalseと評価されますので、通常のブールのようにポインタを使用することもできます。 nullptrはnullptr_t型で、演算子bool()が実装されているので、boolを使うようにすることもできます。
一般的には、nullptrの欠如はエラーの原因です。したがって、C++ 11を使用できる場合、常にnullptrを使用してください。NULLまたは0を使用しないでくださいポインタと比較する - メソッドがオーバーレイされている場合、コンパイラはポインタ型ではなくint型のパラメータを持つメソッドを使用するため、問題に遭遇します。あなたは今、おそらくあなたが望むものではないものを(最初の関数が呼び出されます
foo(NULL);
を呼び出す場合はC++ 11でそう
void foo(int a);
void foo(void *);
:。
のは、次の2つの機能を持っていると仮定しましょう次のように記述します。あなたが持っているでしょう
foo(nullptr);
C++ 98におけるながら書くこと:
foo((void *)0);
これは、C++ 98より前にnullがないことが大きな問題であった理由の1つです。あなたはObjective-Cのよりも似た何かを持っているしたい場合は、(C++ 98のために)次の関数を書くことができます:
template<typename T>
inline bool isNull(const T *obj) {
return obj == ((const T *) 0);
}
// to use it:
if (isNull(myType)) { //myType is a pointer to something
// some code
}
私は1つが、実際に使用されているのを見たことがないが。
この回答がC++での概念の理解に役立つことを願っています。
myValueのタイプは何ですか?もっとコードを追加できますか? – crazyjul
C++にはnullオブジェクトのようなものはありません。あなたは、しかし、nullポインタを持つことができます。 –
ヌル可能なオブジェクト型が必要な場合は、Boost.Optionalもあります。 –