T (C::*)にvoid (Foo::*)()はマッチすべきか
// includeは省略 template<typename T> struct remove_mem_ptr; template<typename T, class C> struct remove_mem_ptr<T (C::*)> { typedef T type; }; template<typename T, class C> struct add_mem_ptr { typedef T (C::*type); }; struct Foo {}; boost::enable_if< boost::is_same< remove_mem_ptr< add_mem_ptr<void(), Foo>::type>::type, void()> >::type func();
以上のようなコードをVC8とgcc4.2でコンパイルしてみたところ、それぞれで挙動が違った。VCでは
error C2039: 'type' : 'boost::enable_if<Cond>' のメンバではありません。 with [ Cond=boost::is_same<void (void),void (void)> ]というようなエラーを吐き、一方のgccではコンパイルに通った。さて、これはどちらの挙動が正しいのだろうか?remove_mem_ptrはTをvoid()という関数としてマッチしてもよいのか?それにしても上のエラー、is_sameの二つの引数はどうみても同じにしか見えないのだが。