1 //===----------------------------------------------------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is dual licensed under the MIT and the University of Illinois Open 6 // Source Licenses. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 // type_traits 11 12 // template <class T, class... Args> 13 // struct is_constructible; 14 15 #include <type_traits> 16 17 struct A 18 { 19 explicit A(int); 20 A(int, double); 21 #if __has_feature(cxx_access_control_sfinae) 22 private: 23 #endif 24 A(char); 25 }; 26 27 template <class T> 28 void test_is_constructible() 29 { 30 static_assert( (std::is_constructible<T>::value), ""); 31 } 32 33 template <class T, class A0> 34 void test_is_constructible() 35 { 36 static_assert( (std::is_constructible<T, A0>::value), ""); 37 } 38 39 template <class T, class A0, class A1> 40 void test_is_constructible() 41 { 42 static_assert( (std::is_constructible<T, A0, A1>::value), ""); 43 } 44 45 template <class T> 46 void test_is_not_constructible() 47 { 48 static_assert((!std::is_constructible<T>::value), ""); 49 } 50 51 template <class T, class A0> 52 void test_is_not_constructible() 53 { 54 static_assert((!std::is_constructible<T, A0>::value), ""); 55 } 56 57 int main() 58 { 59 test_is_constructible<int> (); 60 test_is_constructible<int, const int> (); 61 test_is_constructible<A, int> (); 62 test_is_constructible<A, int, double> (); 63 test_is_constructible<int&, int&> (); 64 65 test_is_not_constructible<A> (); 66 #if __has_feature(cxx_access_control_sfinae) 67 test_is_not_constructible<A, char> (); 68 #else 69 test_is_constructible<A, char> (); 70 #endif 71 test_is_not_constructible<A, void> (); 72 test_is_not_constructible<void> (); 73 test_is_not_constructible<int&> (); 74 } 75