NULLの問題点
このページによると、NULLはC言語との互換性のために残されており、NULLはマクロ定義なので、処理系によって異なることがある。
NULLが0と定義されている、0を使用する場合、「クラス型を引数にもち、ヌルポインタも引数として許す関数と 整数型を引数に取る関数を同時に定義すると、 ヌルを渡した際に常に整数型を引数に取る関数が呼び出される」という問題がある。
またポインタを引数に取る関数と整数型を引数に取る関数を同時に定義すると、ヌルを渡したときコンパイルエラーとなる。
先端技術応用null
上記の問題のない「Effective C++」掲載されている手法。
const class {
public:
template<class T>
operator T*() const { return 0; }
// あらゆる型のメンバポインタへの変換
template<class C, class T>
operator T C::*() const { return 0; }
private:
void operator&() const;
} null;
ただし、gccではuninitialized const(初期化されていない定数)のエラーが出てコンパイルできない。
仕方ないのでとりあえず
class CNull {
public:
template<class T>
operator T*() const { return 0; }
// あらゆる型のメンバポインタへの変換
template<class C, class T>
operator T C::*() const { return 0; }
private:
void operator&() const;
};
const CNull null = CNull();
としている。もっといい方法があるかもしれない。
最終更新:2011年02月17日 15:02