nullptr idiomでエラーになる

C++0xで導入されるnullptrを
C++03のライブラリレイヤでがんばるメソッド nullptrイディオム をゆっくり写経
…してみたらエラー.
イディオムの詳細はC++Idiomsを参照.

エラー1(というか03で対応できないケース)

int main () {
	struct S
	{
		int f (void) const { return __LINE__; }
	};
	int (S::*pmf)() = np::nullptr; // 0xじゃないとだめ
	S ms = {};
	pmf = &S::f;
	cout << "S::f() " << (ms.*pmf)() << endl;
}
$ g++ nullptr.cpp
error: cannot convert ‘const jefuty::nullptr::nullptr_t’ to ‘int (main()::S::*)()’ in initialization

これはローカルクラスはテンプレート引数に出来ないからエラーかと考えられます.
struct Sの定義を関数の外に出してやるとコンパイル出来ます.
もしくは-std=c++0x付ければいいですけど0xならnullptrが組み込みなんだから無意味という(^^;;

エラー2

{
	double * d = np::nullptr;
	// g++45だとコンパイルエラーになる
	// if (np::nullptr==d);
}
error: no match foroperator==’ in ‘jefuty::nullptr::nullptr == d’

…え?
gcc version 4.3.4 20090804 (release) 1 (GCC)
ではコンパイル出来るのに
gcc version 4.5.1 (GCC)
だとエラー.


これはなんだろう…?