1 // PR c++/56041 2 // { dg-do compile { target c++11 } } 3 4 template< class T, T v > 5 struct integral_constant 6 { 7 using type = integral_constant<T,v>; 8 using value_type = T; 9 static constexpr T value = v; Tintegral_constant10 constexpr operator T ( ) noexcept { return value; } 11 }; 12 13 using true_type = integral_constant<bool, true>; 14 using false_type = integral_constant<bool, false>; 15 16 template< bool b, class T = void > struct enable_if { using type = T; }; 17 template< class T > struct enable_if<false, T> { }; 18 19 20 template< class T, 21 class = typename enable_if< true_type{} // should compile; doesn't 22 , T>::type 23 > 24 T try_it( ) { return T{}; } 25 26 int main( ) 27 { 28 static_assert( true_type{} , "failed test 1!" ); 29 static_assert( true_type{} , "failed test 2!" ); 30 static_assert( ! false_type{} , "failed test 3!" ); 31 static_assert( !! true_type{} , "failed test 4!" ); 32 33 return try_it<int>(); 34 } 35