G++ fails when compiling the following program in g++0x mode. It displays "spooky action at a distance" when instantiating the member_ptr template, but I expect the converting assignment operator from weak_ptr to be selected instead.
-------------------------8<----------------------- #include <type_traits> class A { }; class B : public A { }; class C { }; namespace gc { template <typename T> class member_ptr; } template <typename T> class weak_ptr { public: weak_ptr() {} template <typename X> weak_ptr(const weak_ptr<X>& v) {} weak_ptr(const weak_ptr&) = default; weak_ptr(const gc::member_ptr<T>& v); ~weak_ptr() = default; // ------------------ weak_ptr& operator =(const weak_ptr&) = default; template <typename X> weak_ptr& operator =(const weak_ptr<X>& v) { return *this; } }; namespace gc { template <typename T> class member_ptr { static_assert(std::is_base_of<C, T>::value, "spooky action at a distance"); }; } int main(int argc, char *argv[]) { weak_ptr<A> ap1; weak_ptr<B> bp1; ap1 = bp1; return 0; } -------------------------8<----------------------- -- Summary: static_assert and SFINAE Product: gcc Version: 4.4.0 Status: UNCONFIRMED Severity: major Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: piotr dot wyderski at gmail dot com GCC host triplet: GCC-4.4.0 (20090309), Cygwin, Windows XP http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39413