1 // PR c++/95143 2 // { dg-do compile { target c++11 } } 3 4 struct false_type { 5 static constexpr bool value = false; 6 }; 7 8 struct true_type{ 9 static constexpr bool value = true; 10 }; 11 12 template<class T> 13 T&& declval() noexcept; 14 15 template<typename T, typename U, typename = U> 16 struct is_static_castable : false_type 17 {}; 18 template<typename T, typename U> 19 struct is_static_castable<T, U, decltype(static_cast<U>(declval<T>()))> : true_type 20 {}; 21 22 class Base { }; 23 struct A { }; 24 class B: public Base { }; 25 26 int main() 27 { 28 constexpr auto canCast = is_static_castable<A, B>::value; 29 static_assert(!canCast, ""); 30 constexpr auto canCast2 = is_static_castable<A, A>::value; 31 static_assert(canCast2, ""); 32 } 33