// { dg-do compile { target c++11 } } namespace std { template T&& declval(); } template class is_constructible_mini { typedef char __one; typedef struct { char __arr[2]; } __two; template static decltype(::new _Tp1(std::declval<_Args1>()...), __one()) __test(int); template static __two __test(...); public: static const bool value = sizeof(__test<_Tp, _Args...>(0)) == 1; }; /* template class is_constructible_mini<_Tp> { typedef char __one; typedef struct { char __arr[2]; } __two; template static decltype(::new _Tp1, __one()) __test(int); template static __two __test(...); public: static const bool value = sizeof(__test::type>(0)) == 1; }; */ struct A { A(int); }; struct B { }; static_assert( is_constructible_mini::value, ""); static_assert( is_constructible_mini::value, ""); static_assert( !is_constructible_mini::value, ""); static_assert( !is_constructible_mini::value, ""); // doesn't compile without the // partial specialization static_assert( is_constructible_mini::value, ""); static_assert( is_constructible_mini::value, "");