------- Comment #1 from paolo dot carlini at oracle dot com 2009-11-12 04:09 ------- Actually, the observation about C++0x is largely incorrect, because the actual specifications in DR 1255 are different, use std::add_rvalue_reference.
However, my main puzzlement stands. Also, as regards the C++0x common_type (per DR 1255), I'm seeing the problem with cv-qualified void, eg, replace in the snippet int -> void and const int -> const void, because in that case std::add_rvalue_reference does nothing: #include <type_traits> template<typename _Tp> struct __declval_protector { static typename std::add_rvalue_reference<_Tp>::type __delegate(); }; template<typename _Tp> typename std::add_rvalue_reference<_Tp>::type declval() { return __declval_protector<_Tp>::__delegate(); } template<typename _Tp, typename _Up> struct common_type { typedef __decltype(true ? declval<_Tp>() : declval<_Up>()) typet; typedef __decltype(false ? declval<_Tp>() : declval<_Up>()) typef; }; template<typename, typename> struct is_same; template<typename _Tp> struct is_same<_Tp, _Tp> { typedef _Tp type; }; void f() { typedef common_type<void, const void>::typet typet; typedef common_type<void, const void>::typef typef; typedef is_same<typet, typef>::type type; } -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42013