2 // { dg-do compile { target c++11 } }
5 struct nil_ { constexpr nil_ () {} };
9 template <class H, class T = nil_>
18 constexpr cons_(H const &h, T const &t) : head(h), tail(t) {}
20 template <class H, class T = nil_>
21 constexpr cons_<H, T> cons (H const &h, T const &t = nil) { return
25 template <class... T> struct list_s;
26 template <class H, class... T>
27 struct list_s<H, T...> {
28 using type = cons_<H, typename list_s<T...>::type>;
35 using list_ = typename list_s<T...>::type;
36 constexpr nil_ list () { return nil; }
37 template <class H, class... T>
38 constexpr list_<H, T...> list (H h, T... t) { return cons(h, list(t...)); }
40 constexpr auto l1 = list("monkey", 123.4, cons(1, 2), nullptr);