1 // PR c++/59867 2 // { dg-do compile { target c++14 } } 3 // { dg-options -w } 4 5 using namespace std; 6 7 // constant 8 template<typename T, T x> 9 struct meta_value 10 { 11 typedef meta_value type; 12 typedef T value_type; 13 static const T value = x; 14 }; 15 16 // array 17 template<typename T, T... data> 18 struct meta_array 19 { 20 typedef meta_array type; 21 typedef T item_type; 22 }; 23 24 // static array -> runtime array conversion utility 25 template<typename T> 26 struct array_gen; 27 28 template<typename T, T... xs> 29 struct array_gen<meta_array<T, xs...>> 30 { 31 static const T value[sizeof...(xs)]; 32 }; 33 34 template<typename T, T... xs> 35 const T 36 array_gen<meta_array<T, xs...>>::value[sizeof...(xs)] = {xs...}; 37 38 // static string 39 template<typename T, T... xs> 40 constexpr meta_array<T, xs...> 41 operator""_s() 42 { 43 static_assert(sizeof...(xs) == 3, "What's wrong with you?"); 44 return meta_array<T, xs...>(); 45 } 46 47 int 48 main() 49 { 50 auto a = "123"_s; 51 const char (& xs)[3] = array_gen<decltype("123"_s)>::value; 52 } 53