fork download
  1. #include <iostream>
  2. #include <tuple>
  3. #include <type_traits>
  4. #include <functional>
  5.  
  6. template<template<typename...> typename To, typename Tuple>
  7. struct tuple_template_forward;
  8. template<template<typename...> typename To, typename... Args>
  9. struct tuple_template_forward<To, std::tuple<Args...>> final
  10. {
  11. using type = To<Args...>;
  12. };
  13.  
  14. template<typename... Tuples>
  15. struct tuple_type_cat final
  16. {
  17. using type = typename std::function<decltype(std::tuple_cat<Tuples...>)>::result_type;
  18. };
  19.  
  20. namespace impl
  21. {
  22. template<typename Type, typename... Args>
  23. struct tuple_contains;
  24. template<typename Type, typename First, typename... Rest>
  25. struct tuple_contains<Type, First, Rest...> final
  26. {
  27. static constexpr bool value = (std::is_same<Type, First>::value || tuple_contains<Type, Rest...>::value);
  28. };
  29. template<typename Type>
  30. struct tuple_contains<Type> final
  31. : std::false_type
  32. {
  33. };
  34. }
  35.  
  36. template<typename Tuple, typename Type>
  37. struct tuple_contains final
  38. {
  39. static constexpr bool value = tuple_template_forward<impl::tuple_contains, typename tuple_type_cat<std::tuple<Type>, Tuple>::type>::type::value;
  40. };
  41.  
  42. namespace impl
  43. {
  44. template<typename Current, typename... Args>
  45. struct tuple_prune;
  46. template<typename Current, typename First, typename... Rest>
  47. struct tuple_prune<Current, First, Rest...> final
  48. {
  49. using type = typename std::conditional
  50. <
  51. ::tuple_contains<Current, First>::value,
  52. tuple_prune<Current, Rest...>,
  53. tuple_prune<typename tuple_type_cat<Current, std::tuple<First>>::type, Rest...>
  54. >::type::type;
  55. };
  56. template<typename Current>
  57. struct tuple_prune<Current> final
  58. {
  59. using type = Current;
  60. };
  61. }
  62.  
  63. template<typename Tuple>
  64. struct tuple_prune final
  65. {
  66. using type = typename tuple_template_forward<impl::tuple_prune, typename tuple_type_cat<std::tuple<std::tuple<>>, Tuple>::type>::type::type;
  67. };
  68.  
  69. struct Test
  70. {
  71. virtual ~Test() = 0;
  72. };
  73. inline Test::~Test() = default;
  74.  
  75. int main()
  76. {
  77. static_assert(std::is_same<std::tuple<void, Test>, typename tuple_prune<std::tuple<void, void, Test, void, Test, Test>>::type>::value, "error");
  78. }
  79.  
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
In file included from prog.cpp:2:0:
/usr/include/c++/5/tuple: In instantiation of 'struct std::_Head_base<6u, Test, false>':
/usr/include/c++/5/tuple:180:12:   recursively required from 'struct std::_Tuple_impl<1u, void, void, Test, void, Test, Test>'
/usr/include/c++/5/tuple:180:12:   required from 'struct std::_Tuple_impl<0u, std::tuple<>, void, void, Test, void, Test, Test>'
/usr/include/c++/5/tuple:463:11:   required from 'class std::tuple<std::tuple<>, void, void, Test, void, Test, Test>'
/usr/include/c++/5/tuple:1114:5:   required from 'constexpr typename std::__tuple_cat_result<_Tpls ...>::__type std::tuple_cat(_Tpls&& ...) [with _Tpls = {std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test>}; <template-parameter-1-2> = void; typename std::__tuple_cat_result<_Tpls ...>::__type = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>]'
prog.cpp:17:87:   required from 'struct tuple_type_cat<std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:66:141:   required from 'struct tuple_prune<std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:77:121:   required from here
/usr/include/c++/5/tuple:147:13: error: cannot declare field 'std::_Head_base<6u, Test, false>::_M_head_impl' to be of abstract type 'Test'
       _Head _M_head_impl;
             ^
prog.cpp:69:8: note:   because the following virtual functions are pure within 'Test':
 struct Test
        ^
prog.cpp:69:8: note: 	virtual Test::~Test()
In file included from prog.cpp:2:0:
/usr/include/c++/5/tuple: In instantiation of 'struct std::_Head_base<5u, Test, false>':
/usr/include/c++/5/tuple:180:12:   recursively required from 'struct std::_Tuple_impl<1u, void, void, Test, void, Test, Test>'
/usr/include/c++/5/tuple:180:12:   required from 'struct std::_Tuple_impl<0u, std::tuple<>, void, void, Test, void, Test, Test>'
/usr/include/c++/5/tuple:463:11:   required from 'class std::tuple<std::tuple<>, void, void, Test, void, Test, Test>'
/usr/include/c++/5/tuple:1114:5:   required from 'constexpr typename std::__tuple_cat_result<_Tpls ...>::__type std::tuple_cat(_Tpls&& ...) [with _Tpls = {std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test>}; <template-parameter-1-2> = void; typename std::__tuple_cat_result<_Tpls ...>::__type = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>]'
prog.cpp:17:87:   required from 'struct tuple_type_cat<std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:66:141:   required from 'struct tuple_prune<std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:77:121:   required from here
/usr/include/c++/5/tuple:147:13: error: cannot declare field 'std::_Head_base<5u, Test, false>::_M_head_impl' to be of abstract type 'Test'
       _Head _M_head_impl;
             ^
/usr/include/c++/5/tuple: In instantiation of 'struct std::_Head_base<4u, void, false>':
/usr/include/c++/5/tuple:180:12:   recursively required from 'struct std::_Tuple_impl<1u, void, void, Test, void, Test, Test>'
/usr/include/c++/5/tuple:180:12:   required from 'struct std::_Tuple_impl<0u, std::tuple<>, void, void, Test, void, Test, Test>'
/usr/include/c++/5/tuple:463:11:   required from 'class std::tuple<std::tuple<>, void, void, Test, void, Test, Test>'
/usr/include/c++/5/tuple:1114:5:   required from 'constexpr typename std::__tuple_cat_result<_Tpls ...>::__type std::tuple_cat(_Tpls&& ...) [with _Tpls = {std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test>}; <template-parameter-1-2> = void; typename std::__tuple_cat_result<_Tpls ...>::__type = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>]'
prog.cpp:17:87:   required from 'struct tuple_type_cat<std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:66:141:   required from 'struct tuple_prune<std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:77:121:   required from here
/usr/include/c++/5/tuple:107:17: error: forming reference to void
       constexpr _Head_base(const _Head& __h)
                 ^
/usr/include/c++/5/tuple:142:7: error: forming reference to void
       _M_head(_Head_base& __b) noexcept { return __b._M_head_impl; }
       ^
/usr/include/c++/5/tuple:145:7: error: forming reference to void
       _M_head(const _Head_base& __b) noexcept { return __b._M_head_impl; }
       ^
/usr/include/c++/5/tuple:147:13: error: 'std::_Head_base<_Idx, _Head, false>::_M_head_impl' has incomplete type
       _Head _M_head_impl;
             ^
/usr/include/c++/5/tuple:147:13: error: invalid use of 'void'
/usr/include/c++/5/tuple: In instantiation of 'struct std::_Tuple_impl<4u, void, Test, Test>':
/usr/include/c++/5/tuple:180:12:   recursively required from 'struct std::_Tuple_impl<1u, void, void, Test, void, Test, Test>'
/usr/include/c++/5/tuple:180:12:   required from 'struct std::_Tuple_impl<0u, std::tuple<>, void, void, Test, void, Test, Test>'
/usr/include/c++/5/tuple:463:11:   required from 'class std::tuple<std::tuple<>, void, void, Test, void, Test, Test>'
/usr/include/c++/5/tuple:1114:5:   required from 'constexpr typename std::__tuple_cat_result<_Tpls ...>::__type std::tuple_cat(_Tpls&& ...) [with _Tpls = {std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test>}; <template-parameter-1-2> = void; typename std::__tuple_cat_result<_Tpls ...>::__type = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>]'
prog.cpp:17:87:   required from 'struct tuple_type_cat<std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:66:141:   required from 'struct tuple_prune<std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:77:121:   required from here
/usr/include/c++/5/tuple:190:7: error: forming reference to void
       _M_head(_Tuple_impl& __t) noexcept { return _Base::_M_head(__t); }
       ^
/usr/include/c++/5/tuple:193:7: error: forming reference to void
       _M_head(const _Tuple_impl& __t) noexcept { return _Base::_M_head(__t); }
       ^
/usr/include/c++/5/tuple:205:17: error: forming reference to void
       constexpr _Tuple_impl(const _Head& __head, const _Tail&... __tail)
                 ^
/usr/include/c++/5/tuple:242:2: error: forming reference to void
  _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a,
  ^
/usr/include/c++/5/tuple: In instantiation of 'struct std::_Head_base<3u, Test, false>':
/usr/include/c++/5/tuple:180:12:   recursively required from 'struct std::_Tuple_impl<1u, void, void, Test, void, Test, Test>'
/usr/include/c++/5/tuple:180:12:   required from 'struct std::_Tuple_impl<0u, std::tuple<>, void, void, Test, void, Test, Test>'
/usr/include/c++/5/tuple:463:11:   required from 'class std::tuple<std::tuple<>, void, void, Test, void, Test, Test>'
/usr/include/c++/5/tuple:1114:5:   required from 'constexpr typename std::__tuple_cat_result<_Tpls ...>::__type std::tuple_cat(_Tpls&& ...) [with _Tpls = {std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test>}; <template-parameter-1-2> = void; typename std::__tuple_cat_result<_Tpls ...>::__type = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>]'
prog.cpp:17:87:   required from 'struct tuple_type_cat<std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:66:141:   required from 'struct tuple_prune<std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:77:121:   required from here
/usr/include/c++/5/tuple:147:13: error: cannot declare field 'std::_Head_base<3u, Test, false>::_M_head_impl' to be of abstract type 'Test'
       _Head _M_head_impl;
             ^
/usr/include/c++/5/tuple: In instantiation of 'struct std::_Tuple_impl<3u, Test, void, Test, Test>':
/usr/include/c++/5/tuple:180:12:   recursively required from 'struct std::_Tuple_impl<1u, void, void, Test, void, Test, Test>'
/usr/include/c++/5/tuple:180:12:   required from 'struct std::_Tuple_impl<0u, std::tuple<>, void, void, Test, void, Test, Test>'
/usr/include/c++/5/tuple:463:11:   required from 'class std::tuple<std::tuple<>, void, void, Test, void, Test, Test>'
/usr/include/c++/5/tuple:1114:5:   required from 'constexpr typename std::__tuple_cat_result<_Tpls ...>::__type std::tuple_cat(_Tpls&& ...) [with _Tpls = {std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test>}; <template-parameter-1-2> = void; typename std::__tuple_cat_result<_Tpls ...>::__type = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>]'
prog.cpp:17:87:   required from 'struct tuple_type_cat<std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:66:141:   required from 'struct tuple_prune<std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:77:121:   required from here
/usr/include/c++/5/tuple:205:17: error: forming reference to void
       constexpr _Tuple_impl(const _Head& __head, const _Tail&... __tail)
                 ^
/usr/include/c++/5/tuple:242:2: error: forming reference to void
  _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a,
  ^
/usr/include/c++/5/tuple: In instantiation of 'struct std::_Head_base<2u, void, false>':
/usr/include/c++/5/tuple:180:12:   recursively required from 'struct std::_Tuple_impl<1u, void, void, Test, void, Test, Test>'
/usr/include/c++/5/tuple:180:12:   required from 'struct std::_Tuple_impl<0u, std::tuple<>, void, void, Test, void, Test, Test>'
/usr/include/c++/5/tuple:463:11:   required from 'class std::tuple<std::tuple<>, void, void, Test, void, Test, Test>'
/usr/include/c++/5/tuple:1114:5:   required from 'constexpr typename std::__tuple_cat_result<_Tpls ...>::__type std::tuple_cat(_Tpls&& ...) [with _Tpls = {std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test>}; <template-parameter-1-2> = void; typename std::__tuple_cat_result<_Tpls ...>::__type = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>]'
prog.cpp:17:87:   required from 'struct tuple_type_cat<std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:66:141:   required from 'struct tuple_prune<std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:77:121:   required from here
/usr/include/c++/5/tuple:107:17: error: forming reference to void
       constexpr _Head_base(const _Head& __h)
                 ^
/usr/include/c++/5/tuple:142:7: error: forming reference to void
       _M_head(_Head_base& __b) noexcept { return __b._M_head_impl; }
       ^
/usr/include/c++/5/tuple:145:7: error: forming reference to void
       _M_head(const _Head_base& __b) noexcept { return __b._M_head_impl; }
       ^
/usr/include/c++/5/tuple:147:13: error: 'std::_Head_base<_Idx, _Head, false>::_M_head_impl' has incomplete type
       _Head _M_head_impl;
             ^
/usr/include/c++/5/tuple:147:13: error: invalid use of 'void'
/usr/include/c++/5/tuple: In instantiation of 'struct std::_Tuple_impl<2u, void, Test, void, Test, Test>':
/usr/include/c++/5/tuple:180:12:   recursively required from 'struct std::_Tuple_impl<1u, void, void, Test, void, Test, Test>'
/usr/include/c++/5/tuple:180:12:   required from 'struct std::_Tuple_impl<0u, std::tuple<>, void, void, Test, void, Test, Test>'
/usr/include/c++/5/tuple:463:11:   required from 'class std::tuple<std::tuple<>, void, void, Test, void, Test, Test>'
/usr/include/c++/5/tuple:1114:5:   required from 'constexpr typename std::__tuple_cat_result<_Tpls ...>::__type std::tuple_cat(_Tpls&& ...) [with _Tpls = {std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test>}; <template-parameter-1-2> = void; typename std::__tuple_cat_result<_Tpls ...>::__type = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>]'
prog.cpp:17:87:   required from 'struct tuple_type_cat<std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:66:141:   required from 'struct tuple_prune<std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:77:121:   required from here
/usr/include/c++/5/tuple:190:7: error: forming reference to void
       _M_head(_Tuple_impl& __t) noexcept { return _Base::_M_head(__t); }
       ^
/usr/include/c++/5/tuple:193:7: error: forming reference to void
       _M_head(const _Tuple_impl& __t) noexcept { return _Base::_M_head(__t); }
       ^
/usr/include/c++/5/tuple:205:17: error: forming reference to void
       constexpr _Tuple_impl(const _Head& __head, const _Tail&... __tail)
                 ^
/usr/include/c++/5/tuple:242:2: error: forming reference to void
  _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a,
  ^
/usr/include/c++/5/tuple: In instantiation of 'struct std::_Head_base<1u, void, false>':
/usr/include/c++/5/tuple:180:12:   recursively required from 'struct std::_Tuple_impl<1u, void, void, Test, void, Test, Test>'
/usr/include/c++/5/tuple:180:12:   required from 'struct std::_Tuple_impl<0u, std::tuple<>, void, void, Test, void, Test, Test>'
/usr/include/c++/5/tuple:463:11:   required from 'class std::tuple<std::tuple<>, void, void, Test, void, Test, Test>'
/usr/include/c++/5/tuple:1114:5:   required from 'constexpr typename std::__tuple_cat_result<_Tpls ...>::__type std::tuple_cat(_Tpls&& ...) [with _Tpls = {std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test>}; <template-parameter-1-2> = void; typename std::__tuple_cat_result<_Tpls ...>::__type = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>]'
prog.cpp:17:87:   required from 'struct tuple_type_cat<std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:66:141:   required from 'struct tuple_prune<std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:77:121:   required from here
/usr/include/c++/5/tuple:107:17: error: forming reference to void
       constexpr _Head_base(const _Head& __h)
                 ^
/usr/include/c++/5/tuple:142:7: error: forming reference to void
       _M_head(_Head_base& __b) noexcept { return __b._M_head_impl; }
       ^
/usr/include/c++/5/tuple:145:7: error: forming reference to void
       _M_head(const _Head_base& __b) noexcept { return __b._M_head_impl; }
       ^
/usr/include/c++/5/tuple:147:13: error: 'std::_Head_base<_Idx, _Head, false>::_M_head_impl' has incomplete type
       _Head _M_head_impl;
             ^
/usr/include/c++/5/tuple:147:13: error: invalid use of 'void'
/usr/include/c++/5/tuple: In instantiation of 'struct std::_Tuple_impl<1u, void, void, Test, void, Test, Test>':
/usr/include/c++/5/tuple:180:12:   required from 'struct std::_Tuple_impl<0u, std::tuple<>, void, void, Test, void, Test, Test>'
/usr/include/c++/5/tuple:463:11:   required from 'class std::tuple<std::tuple<>, void, void, Test, void, Test, Test>'
/usr/include/c++/5/tuple:1114:5:   required from 'constexpr typename std::__tuple_cat_result<_Tpls ...>::__type std::tuple_cat(_Tpls&& ...) [with _Tpls = {std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test>}; <template-parameter-1-2> = void; typename std::__tuple_cat_result<_Tpls ...>::__type = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>]'
prog.cpp:17:87:   required from 'struct tuple_type_cat<std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:66:141:   required from 'struct tuple_prune<std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:77:121:   required from here
/usr/include/c++/5/tuple:190:7: error: forming reference to void
       _M_head(_Tuple_impl& __t) noexcept { return _Base::_M_head(__t); }
       ^
/usr/include/c++/5/tuple:193:7: error: forming reference to void
       _M_head(const _Tuple_impl& __t) noexcept { return _Base::_M_head(__t); }
       ^
/usr/include/c++/5/tuple:205:17: error: forming reference to void
       constexpr _Tuple_impl(const _Head& __head, const _Tail&... __tail)
                 ^
/usr/include/c++/5/tuple:242:2: error: forming reference to void
  _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a,
  ^
/usr/include/c++/5/tuple: In instantiation of 'struct std::_Tuple_impl<0u, std::tuple<>, void, void, Test, void, Test, Test>':
/usr/include/c++/5/tuple:463:11:   required from 'class std::tuple<std::tuple<>, void, void, Test, void, Test, Test>'
/usr/include/c++/5/tuple:1114:5:   required from 'constexpr typename std::__tuple_cat_result<_Tpls ...>::__type std::tuple_cat(_Tpls&& ...) [with _Tpls = {std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test>}; <template-parameter-1-2> = void; typename std::__tuple_cat_result<_Tpls ...>::__type = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>]'
prog.cpp:17:87:   required from 'struct tuple_type_cat<std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:66:141:   required from 'struct tuple_prune<std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:77:121:   required from here
/usr/include/c++/5/tuple:205:17: error: forming reference to void
       constexpr _Tuple_impl(const _Head& __head, const _Tail&... __tail)
                 ^
/usr/include/c++/5/tuple:242:2: error: forming reference to void
  _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a,
  ^
/usr/include/c++/5/tuple: In instantiation of 'class std::tuple<std::tuple<>, void, void, Test, void, Test, Test>':
/usr/include/c++/5/tuple:1114:5:   required from 'constexpr typename std::__tuple_cat_result<_Tpls ...>::__type std::tuple_cat(_Tpls&& ...) [with _Tpls = {std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test>}; <template-parameter-1-2> = void; typename std::__tuple_cat_result<_Tpls ...>::__type = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>]'
prog.cpp:17:87:   required from 'struct tuple_type_cat<std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:66:141:   required from 'struct tuple_prune<std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:77:121:   required from here
/usr/include/c++/5/tuple:472:17: error: forming reference to void
       constexpr tuple(const _Elements&... __elements)
                 ^
/usr/include/c++/5/tuple:506:2: error: forming reference to void
  tuple(allocator_arg_t __tag, const _Alloc& __a,
  ^
/usr/include/c++/5/tuple: In instantiation of 'struct std::_Head_base<4u, Test, false>':
/usr/include/c++/5/tuple:180:12:   recursively required from 'struct std::_Tuple_impl<1u, void, Test, void, Test, Test>'
/usr/include/c++/5/tuple:180:12:   required from 'struct std::_Tuple_impl<0u, void, void, Test, void, Test, Test>'
/usr/include/c++/5/tuple:463:11:   required from 'class std::tuple<void, void, Test, void, Test, Test>'
/usr/include/c++/5/bits/move.h:77:36:   required from 'constexpr _Tp&& std::forward(typename std::remove_reference<_From>::type&) [with _Tp = std::tuple<void, void, Test, void, Test, Test>; typename std::remove_reference<_From>::type = std::tuple<void, void, Test, void, Test, Test>]'
/usr/include/c++/5/tuple:1120:51:   required from 'constexpr typename std::__tuple_cat_result<_Tpls ...>::__type std::tuple_cat(_Tpls&& ...) [with _Tpls = std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test>; <template-parameter-1-2> = void; typename std::__tuple_cat_result<_Tpls ...>::__type = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>]'
prog.cpp:17:87:   required from 'struct tuple_type_cat<std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:66:141:   required from 'struct tuple_prune<std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:77:121:   required from here
/usr/include/c++/5/tuple:147:13: error: cannot declare field 'std::_Head_base<4u, Test, false>::_M_head_impl' to be of abstract type 'Test'
       _Head _M_head_impl;
             ^
/usr/include/c++/5/tuple: In instantiation of 'struct std::_Head_base<3u, void, false>':
/usr/include/c++/5/tuple:180:12:   recursively required from 'struct std::_Tuple_impl<1u, void, Test, void, Test, Test>'
/usr/include/c++/5/tuple:180:12:   required from 'struct std::_Tuple_impl<0u, void, void, Test, void, Test, Test>'
/usr/include/c++/5/tuple:463:11:   required from 'class std::tuple<void, void, Test, void, Test, Test>'
/usr/include/c++/5/bits/move.h:77:36:   required from 'constexpr _Tp&& std::forward(typename std::remove_reference<_From>::type&) [with _Tp = std::tuple<void, void, Test, void, Test, Test>; typename std::remove_reference<_From>::type = std::tuple<void, void, Test, void, Test, Test>]'
/usr/include/c++/5/tuple:1120:51:   required from 'constexpr typename std::__tuple_cat_result<_Tpls ...>::__type std::tuple_cat(_Tpls&& ...) [with _Tpls = std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test>; <template-parameter-1-2> = void; typename std::__tuple_cat_result<_Tpls ...>::__type = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>]'
prog.cpp:17:87:   required from 'struct tuple_type_cat<std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:66:141:   required from 'struct tuple_prune<std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:77:121:   required from here
/usr/include/c++/5/tuple:107:17: error: forming reference to void
       constexpr _Head_base(const _Head& __h)
                 ^
/usr/include/c++/5/tuple:142:7: error: forming reference to void
       _M_head(_Head_base& __b) noexcept { return __b._M_head_impl; }
       ^
/usr/include/c++/5/tuple:145:7: error: forming reference to void
       _M_head(const _Head_base& __b) noexcept { return __b._M_head_impl; }
       ^
/usr/include/c++/5/tuple:147:13: error: 'std::_Head_base<_Idx, _Head, false>::_M_head_impl' has incomplete type
       _Head _M_head_impl;
             ^
/usr/include/c++/5/tuple:147:13: error: invalid use of 'void'
/usr/include/c++/5/tuple: In instantiation of 'struct std::_Tuple_impl<3u, void, Test, Test>':
/usr/include/c++/5/tuple:180:12:   recursively required from 'struct std::_Tuple_impl<1u, void, Test, void, Test, Test>'
/usr/include/c++/5/tuple:180:12:   required from 'struct std::_Tuple_impl<0u, void, void, Test, void, Test, Test>'
/usr/include/c++/5/tuple:463:11:   required from 'class std::tuple<void, void, Test, void, Test, Test>'
/usr/include/c++/5/bits/move.h:77:36:   required from 'constexpr _Tp&& std::forward(typename std::remove_reference<_From>::type&) [with _Tp = std::tuple<void, void, Test, void, Test, Test>; typename std::remove_reference<_From>::type = std::tuple<void, void, Test, void, Test, Test>]'
/usr/include/c++/5/tuple:1120:51:   required from 'constexpr typename std::__tuple_cat_result<_Tpls ...>::__type std::tuple_cat(_Tpls&& ...) [with _Tpls = std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test>; <template-parameter-1-2> = void; typename std::__tuple_cat_result<_Tpls ...>::__type = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>]'
prog.cpp:17:87:   required from 'struct tuple_type_cat<std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:66:141:   required from 'struct tuple_prune<std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:77:121:   required from here
/usr/include/c++/5/tuple:190:7: error: forming reference to void
       _M_head(_Tuple_impl& __t) noexcept { return _Base::_M_head(__t); }
       ^
/usr/include/c++/5/tuple:193:7: error: forming reference to void
       _M_head(const _Tuple_impl& __t) noexcept { return _Base::_M_head(__t); }
       ^
/usr/include/c++/5/tuple:205:17: error: forming reference to void
       constexpr _Tuple_impl(const _Head& __head, const _Tail&... __tail)
                 ^
/usr/include/c++/5/tuple:242:2: error: forming reference to void
  _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a,
  ^
/usr/include/c++/5/tuple: In instantiation of 'struct std::_Head_base<2u, Test, false>':
/usr/include/c++/5/tuple:180:12:   recursively required from 'struct std::_Tuple_impl<1u, void, Test, void, Test, Test>'
/usr/include/c++/5/tuple:180:12:   required from 'struct std::_Tuple_impl<0u, void, void, Test, void, Test, Test>'
/usr/include/c++/5/tuple:463:11:   required from 'class std::tuple<void, void, Test, void, Test, Test>'
/usr/include/c++/5/bits/move.h:77:36:   required from 'constexpr _Tp&& std::forward(typename std::remove_reference<_From>::type&) [with _Tp = std::tuple<void, void, Test, void, Test, Test>; typename std::remove_reference<_From>::type = std::tuple<void, void, Test, void, Test, Test>]'
/usr/include/c++/5/tuple:1120:51:   required from 'constexpr typename std::__tuple_cat_result<_Tpls ...>::__type std::tuple_cat(_Tpls&& ...) [with _Tpls = std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test>; <template-parameter-1-2> = void; typename std::__tuple_cat_result<_Tpls ...>::__type = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>]'
prog.cpp:17:87:   required from 'struct tuple_type_cat<std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:66:141:   required from 'struct tuple_prune<std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:77:121:   required from here
/usr/include/c++/5/tuple:147:13: error: cannot declare field 'std::_Head_base<2u, Test, false>::_M_head_impl' to be of abstract type 'Test'
       _Head _M_head_impl;
             ^
/usr/include/c++/5/tuple: In instantiation of 'struct std::_Tuple_impl<2u, Test, void, Test, Test>':
/usr/include/c++/5/tuple:180:12:   recursively required from 'struct std::_Tuple_impl<1u, void, Test, void, Test, Test>'
/usr/include/c++/5/tuple:180:12:   required from 'struct std::_Tuple_impl<0u, void, void, Test, void, Test, Test>'
/usr/include/c++/5/tuple:463:11:   required from 'class std::tuple<void, void, Test, void, Test, Test>'
/usr/include/c++/5/bits/move.h:77:36:   required from 'constexpr _Tp&& std::forward(typename std::remove_reference<_From>::type&) [with _Tp = std::tuple<void, void, Test, void, Test, Test>; typename std::remove_reference<_From>::type = std::tuple<void, void, Test, void, Test, Test>]'
/usr/include/c++/5/tuple:1120:51:   required from 'constexpr typename std::__tuple_cat_result<_Tpls ...>::__type std::tuple_cat(_Tpls&& ...) [with _Tpls = std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test>; <template-parameter-1-2> = void; typename std::__tuple_cat_result<_Tpls ...>::__type = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>]'
prog.cpp:17:87:   required from 'struct tuple_type_cat<std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:66:141:   required from 'struct tuple_prune<std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:77:121:   required from here
/usr/include/c++/5/tuple:205:17: error: forming reference to void
       constexpr _Tuple_impl(const _Head& __head, const _Tail&... __tail)
                 ^
/usr/include/c++/5/tuple:242:2: error: forming reference to void
  _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a,
  ^
/usr/include/c++/5/tuple: In instantiation of 'struct std::_Tuple_impl<1u, void, Test, void, Test, Test>':
/usr/include/c++/5/tuple:180:12:   required from 'struct std::_Tuple_impl<0u, void, void, Test, void, Test, Test>'
/usr/include/c++/5/tuple:463:11:   required from 'class std::tuple<void, void, Test, void, Test, Test>'
/usr/include/c++/5/bits/move.h:77:36:   required from 'constexpr _Tp&& std::forward(typename std::remove_reference<_From>::type&) [with _Tp = std::tuple<void, void, Test, void, Test, Test>; typename std::remove_reference<_From>::type = std::tuple<void, void, Test, void, Test, Test>]'
/usr/include/c++/5/tuple:1120:51:   required from 'constexpr typename std::__tuple_cat_result<_Tpls ...>::__type std::tuple_cat(_Tpls&& ...) [with _Tpls = std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test>; <template-parameter-1-2> = void; typename std::__tuple_cat_result<_Tpls ...>::__type = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>]'
prog.cpp:17:87:   required from 'struct tuple_type_cat<std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:66:141:   required from 'struct tuple_prune<std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:77:121:   required from here
/usr/include/c++/5/tuple:190:7: error: forming reference to void
       _M_head(_Tuple_impl& __t) noexcept { return _Base::_M_head(__t); }
       ^
/usr/include/c++/5/tuple:193:7: error: forming reference to void
       _M_head(const _Tuple_impl& __t) noexcept { return _Base::_M_head(__t); }
       ^
/usr/include/c++/5/tuple:205:17: error: forming reference to void
       constexpr _Tuple_impl(const _Head& __head, const _Tail&... __tail)
                 ^
/usr/include/c++/5/tuple:242:2: error: forming reference to void
  _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a,
  ^
/usr/include/c++/5/tuple: In instantiation of 'struct std::_Head_base<0u, void, false>':
/usr/include/c++/5/tuple:180:12:   required from 'struct std::_Tuple_impl<0u, void, void, Test, void, Test, Test>'
/usr/include/c++/5/tuple:463:11:   required from 'class std::tuple<void, void, Test, void, Test, Test>'
/usr/include/c++/5/bits/move.h:77:36:   required from 'constexpr _Tp&& std::forward(typename std::remove_reference<_From>::type&) [with _Tp = std::tuple<void, void, Test, void, Test, Test>; typename std::remove_reference<_From>::type = std::tuple<void, void, Test, void, Test, Test>]'
/usr/include/c++/5/tuple:1120:51:   required from 'constexpr typename std::__tuple_cat_result<_Tpls ...>::__type std::tuple_cat(_Tpls&& ...) [with _Tpls = std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test>; <template-parameter-1-2> = void; typename std::__tuple_cat_result<_Tpls ...>::__type = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>]'
prog.cpp:17:87:   required from 'struct tuple_type_cat<std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:66:141:   required from 'struct tuple_prune<std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:77:121:   required from here
/usr/include/c++/5/tuple:107:17: error: forming reference to void
       constexpr _Head_base(const _Head& __h)
                 ^
/usr/include/c++/5/tuple:142:7: error: forming reference to void
       _M_head(_Head_base& __b) noexcept { return __b._M_head_impl; }
       ^
/usr/include/c++/5/tuple:145:7: error: forming reference to void
       _M_head(const _Head_base& __b) noexcept { return __b._M_head_impl; }
       ^
/usr/include/c++/5/tuple:147:13: error: 'std::_Head_base<_Idx, _Head, false>::_M_head_impl' has incomplete type
       _Head _M_head_impl;
             ^
/usr/include/c++/5/tuple:147:13: error: invalid use of 'void'
/usr/include/c++/5/tuple: In instantiation of 'struct std::_Tuple_impl<0u, void, void, Test, void, Test, Test>':
/usr/include/c++/5/tuple:463:11:   required from 'class std::tuple<void, void, Test, void, Test, Test>'
/usr/include/c++/5/bits/move.h:77:36:   required from 'constexpr _Tp&& std::forward(typename std::remove_reference<_From>::type&) [with _Tp = std::tuple<void, void, Test, void, Test, Test>; typename std::remove_reference<_From>::type = std::tuple<void, void, Test, void, Test, Test>]'
/usr/include/c++/5/tuple:1120:51:   required from 'constexpr typename std::__tuple_cat_result<_Tpls ...>::__type std::tuple_cat(_Tpls&& ...) [with _Tpls = std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test>; <template-parameter-1-2> = void; typename std::__tuple_cat_result<_Tpls ...>::__type = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>]'
prog.cpp:17:87:   required from 'struct tuple_type_cat<std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:66:141:   required from 'struct tuple_prune<std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:77:121:   required from here
/usr/include/c++/5/tuple:190:7: error: forming reference to void
       _M_head(_Tuple_impl& __t) noexcept { return _Base::_M_head(__t); }
       ^
/usr/include/c++/5/tuple:193:7: error: forming reference to void
       _M_head(const _Tuple_impl& __t) noexcept { return _Base::_M_head(__t); }
       ^
/usr/include/c++/5/tuple:205:17: error: forming reference to void
       constexpr _Tuple_impl(const _Head& __head, const _Tail&... __tail)
                 ^
/usr/include/c++/5/tuple:242:2: error: forming reference to void
  _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a,
  ^
/usr/include/c++/5/tuple: In instantiation of 'class std::tuple<void, void, Test, void, Test, Test>':
/usr/include/c++/5/bits/move.h:77:36:   required from 'constexpr _Tp&& std::forward(typename std::remove_reference<_From>::type&) [with _Tp = std::tuple<void, void, Test, void, Test, Test>; typename std::remove_reference<_From>::type = std::tuple<void, void, Test, void, Test, Test>]'
/usr/include/c++/5/tuple:1120:51:   required from 'constexpr typename std::__tuple_cat_result<_Tpls ...>::__type std::tuple_cat(_Tpls&& ...) [with _Tpls = std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test>; <template-parameter-1-2> = void; typename std::__tuple_cat_result<_Tpls ...>::__type = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>]'
prog.cpp:17:87:   required from 'struct tuple_type_cat<std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:66:141:   required from 'struct tuple_prune<std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:77:121:   required from here
/usr/include/c++/5/tuple:472:17: error: forming reference to void
       constexpr tuple(const _Elements&... __elements)
                 ^
/usr/include/c++/5/tuple:506:2: error: forming reference to void
  tuple(allocator_arg_t __tag, const _Alloc& __a,
  ^
/usr/include/c++/5/tuple: In instantiation of 'static constexpr _Ret std::__tuple_concater<_Ret, std::_Index_tuple<_Is ...>, _Tp, _Tpls ...>::_S_do(_Tp&&, _Tpls&& ..., _Us&& ...) [with _Us = {std::tuple<>}; _Ret = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>; unsigned int ..._Is = 0u, 1u, 2u, 3u, 4u, 5u; _Tp = std::tuple<void, void, Test, void, Test, Test>; _Tpls = {}]':
/usr/include/c++/5/tuple:1093:24:   required from 'static constexpr _Ret std::__tuple_concater<_Ret, std::_Index_tuple<_Is ...>, _Tp, _Tpls ...>::_S_do(_Tp&&, _Tpls&& ..., _Us&& ...) [with _Us = {}; _Ret = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>; unsigned int ..._Is = {0u}; _Tp = std::tuple<std::tuple<> >; _Tpls = {std::tuple<void, void, Test, void, Test, Test>}]'
/usr/include/c++/5/tuple:1120:31:   required from 'constexpr typename std::__tuple_cat_result<_Tpls ...>::__type std::tuple_cat(_Tpls&& ...) [with _Tpls = {std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test>}; <template-parameter-1-2> = void; typename std::__tuple_cat_result<_Tpls ...>::__type = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>]'
prog.cpp:17:87:   required from 'struct tuple_type_cat<std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:66:141:   required from 'struct tuple_prune<std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:77:121:   required from here
/usr/include/c++/5/tuple:1095:24: error: no matching function for call to 'get(std::tuple<void, void, Test, void, Test, Test>)'
           std::get<_Is>(std::forward<_Tp>(__tp))...);
                        ^
In file included from /usr/include/c++/5/tuple:38:0,
                 from prog.cpp:2:
/usr/include/c++/5/utility:147:5: note: candidate: template<unsigned int _Int, class _Tp1, class _Tp2> constexpr typename std::tuple_element<_Int, std::pair<_Tp1, _Tp2> >::type& std::get(std::pair<_Tp1, _Tp2>&)
     get(std::pair<_Tp1, _Tp2>& __in) noexcept
     ^
/usr/include/c++/5/utility:147:5: note:   template argument deduction/substitution failed:
In file included from prog.cpp:2:0:
/usr/include/c++/5/tuple:1095:24: note:   'std::tuple<void, void, Test, void, Test, Test>' is not derived from 'std::pair<_Tp1, _Tp2>'
           std::get<_Is>(std::forward<_Tp>(__tp))...);
                        ^
In file included from /usr/include/c++/5/tuple:38:0,
                 from prog.cpp:2:
/usr/include/c++/5/utility:152:5: note: candidate: template<unsigned int _Int, class _Tp1, class _Tp2> constexpr typename std::tuple_element<_Int, std::pair<_Tp1, _Tp2> >::type&& std::get(std::pair<_Tp1, _Tp2>&&)
     get(std::pair<_Tp1, _Tp2>&& __in) noexcept
     ^
/usr/include/c++/5/utility:152:5: note:   template argument deduction/substitution failed:
In file included from prog.cpp:2:0:
/usr/include/c++/5/tuple:1095:24: note:   'std::tuple<void, void, Test, void, Test, Test>' is not derived from 'std::pair<_Tp1, _Tp2>'
           std::get<_Is>(std::forward<_Tp>(__tp))...);
                        ^
In file included from /usr/include/c++/5/tuple:38:0,
                 from prog.cpp:2:
/usr/include/c++/5/utility:157:5: note: candidate: template<unsigned int _Int, class _Tp1, class _Tp2> constexpr const typename std::tuple_element<_Int, std::pair<_Tp1, _Tp2> >::type& std::get(const std::pair<_Tp1, _Tp2>&)
     get(const std::pair<_Tp1, _Tp2>& __in) noexcept
     ^
/usr/include/c++/5/utility:157:5: note:   template argument deduction/substitution failed:
In file included from prog.cpp:2:0:
/usr/include/c++/5/tuple:1095:24: note:   'std::tuple<void, void, Test, void, Test, Test>' is not derived from 'const std::pair<_Tp1, _Tp2>'
           std::get<_Is>(std::forward<_Tp>(__tp))...);
                        ^
In file included from /usr/include/c++/5/tuple:38:0,
                 from prog.cpp:2:
/usr/include/c++/5/utility:166:5: note: candidate: template<class _Tp, class _Up> constexpr _Tp& std::get(std::pair<_T1, _T2>&)
     get(pair<_Tp, _Up>& __p) noexcept
     ^
/usr/include/c++/5/utility:166:5: note:   template argument deduction/substitution failed:
/usr/include/c++/5/utility:171:5: note: candidate: template<class _Tp, class _Up> constexpr const _Tp& std::get(const std::pair<_T1, _T2>&)
     get(const pair<_Tp, _Up>& __p) noexcept
     ^
/usr/include/c++/5/utility:171:5: note:   template argument deduction/substitution failed:
/usr/include/c++/5/utility:176:5: note: candidate: template<class _Tp, class _Up> constexpr _Tp&& std::get(std::pair<_T1, _T2>&&)
     get(pair<_Tp, _Up>&& __p) noexcept
     ^
/usr/include/c++/5/utility:176:5: note:   template argument deduction/substitution failed:
/usr/include/c++/5/utility:181:5: note: candidate: template<class _Tp, class _Up> constexpr _Tp& std::get(std::pair<_Up, _Tp>&)
     get(pair<_Up, _Tp>& __p) noexcept
     ^
/usr/include/c++/5/utility:181:5: note:   template argument deduction/substitution failed:
/usr/include/c++/5/utility:186:5: note: candidate: template<class _Tp, class _Up> constexpr const _Tp& std::get(const std::pair<_Up, _Tp>&)
     get(const pair<_Up, _Tp>& __p) noexcept
     ^
/usr/include/c++/5/utility:186:5: note:   template argument deduction/substitution failed:
/usr/include/c++/5/utility:191:5: note: candidate: template<class _Tp, class _Up> constexpr _Tp&& std::get(std::pair<_Up, _Tp>&&)
     get(pair<_Up, _Tp>&& __p) noexcept
     ^
/usr/include/c++/5/utility:191:5: note:   template argument deduction/substitution failed:
In file included from /usr/include/c++/5/tuple:39:0,
                 from prog.cpp:2:
/usr/include/c++/5/array:280:5: note: candidate: template<unsigned int _Int, class _Tp, unsigned int _Nm> constexpr _Tp& std::get(std::array<_Tp, _Nm>&)
     get(array<_Tp, _Nm>& __arr) noexcept
     ^
/usr/include/c++/5/array:280:5: note:   template argument deduction/substitution failed:
In file included from prog.cpp:2:0:
/usr/include/c++/5/tuple:1095:24: note:   'std::tuple<void, void, Test, void, Test, Test>' is not derived from 'std::array<_Tp, _Nm>'
           std::get<_Is>(std::forward<_Tp>(__tp))...);
                        ^
In file included from /usr/include/c++/5/tuple:39:0,
                 from prog.cpp:2:
/usr/include/c++/5/array:289:5: note: candidate: template<unsigned int _Int, class _Tp, unsigned int _Nm> constexpr _Tp&& std::get(std::array<_Tp, _Nm>&&)
     get(array<_Tp, _Nm>&& __arr) noexcept
     ^
/usr/include/c++/5/array:289:5: note:   template argument deduction/substitution failed:
In file included from prog.cpp:2:0:
/usr/include/c++/5/tuple:1095:24: note:   'std::tuple<void, void, Test, void, Test, Test>' is not derived from 'std::array<_Tp, _Nm>'
           std::get<_Is>(std::forward<_Tp>(__tp))...);
                        ^
In file included from /usr/include/c++/5/tuple:39:0,
                 from prog.cpp:2:
/usr/include/c++/5/array:297:5: note: candidate: template<unsigned int _Int, class _Tp, unsigned int _Nm> constexpr const _Tp& std::get(const std::array<_Tp, _Nm>&)
     get(const array<_Tp, _Nm>& __arr) noexcept
     ^
/usr/include/c++/5/array:297:5: note:   template argument deduction/substitution failed:
In file included from prog.cpp:2:0:
/usr/include/c++/5/tuple:1095:24: note:   'std::tuple<void, void, Test, void, Test, Test>' is not derived from 'const std::array<_Tp, _Nm>'
           std::get<_Is>(std::forward<_Tp>(__tp))...);
                        ^
/usr/include/c++/5/tuple:832:5: note: candidate: template<unsigned int __i, class ... _Elements> constexpr std::__tuple_element_t<__i, std::tuple<_Elements ...> >& std::get(std::tuple<_Elements ...>&)
     get(tuple<_Elements...>& __t) noexcept
     ^
/usr/include/c++/5/tuple:832:5: note:   template argument deduction/substitution failed:
/usr/include/c++/5/tuple: In substitution of 'template<unsigned int __i, class ... _Elements> constexpr std::__tuple_element_t<__i, std::tuple<_Elements ...> >& std::get(std::tuple<_Elements ...>&) [with unsigned int __i = 0u; _Elements = {void, void, Test, void, Test, Test}]':
/usr/include/c++/5/tuple:1095:24:   required from 'static constexpr _Ret std::__tuple_concater<_Ret, std::_Index_tuple<_Is ...>, _Tp, _Tpls ...>::_S_do(_Tp&&, _Tpls&& ..., _Us&& ...) [with _Us = {std::tuple<>}; _Ret = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>; unsigned int ..._Is = 0u, 1u, 2u, 3u, 4u, 5u; _Tp = std::tuple<void, void, Test, void, Test, Test>; _Tpls = {}]'
/usr/include/c++/5/tuple:1093:24:   required from 'static constexpr _Ret std::__tuple_concater<_Ret, std::_Index_tuple<_Is ...>, _Tp, _Tpls ...>::_S_do(_Tp&&, _Tpls&& ..., _Us&& ...) [with _Us = {}; _Ret = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>; unsigned int ..._Is = {0u}; _Tp = std::tuple<std::tuple<> >; _Tpls = {std::tuple<void, void, Test, void, Test, Test>}]'
/usr/include/c++/5/tuple:1120:31:   required from 'constexpr typename std::__tuple_cat_result<_Tpls ...>::__type std::tuple_cat(_Tpls&& ...) [with _Tpls = {std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test>}; <template-parameter-1-2> = void; typename std::__tuple_cat_result<_Tpls ...>::__type = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>]'
prog.cpp:17:87:   required from 'struct tuple_type_cat<std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:66:141:   required from 'struct tuple_prune<std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:77:121:   required from here
/usr/include/c++/5/tuple:832:5: error: forming reference to void
/usr/include/c++/5/tuple: In instantiation of 'static constexpr _Ret std::__tuple_concater<_Ret, std::_Index_tuple<_Is ...>, _Tp, _Tpls ...>::_S_do(_Tp&&, _Tpls&& ..., _Us&& ...) [with _Us = {std::tuple<>}; _Ret = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>; unsigned int ..._Is = 0u, 1u, 2u, 3u, 4u, 5u; _Tp = std::tuple<void, void, Test, void, Test, Test>; _Tpls = {}]':
/usr/include/c++/5/tuple:1093:24:   required from 'static constexpr _Ret std::__tuple_concater<_Ret, std::_Index_tuple<_Is ...>, _Tp, _Tpls ...>::_S_do(_Tp&&, _Tpls&& ..., _Us&& ...) [with _Us = {}; _Ret = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>; unsigned int ..._Is = {0u}; _Tp = std::tuple<std::tuple<> >; _Tpls = {std::tuple<void, void, Test, void, Test, Test>}]'
/usr/include/c++/5/tuple:1120:31:   required from 'constexpr typename std::__tuple_cat_result<_Tpls ...>::__type std::tuple_cat(_Tpls&& ...) [with _Tpls = {std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test>}; <template-parameter-1-2> = void; typename std::__tuple_cat_result<_Tpls ...>::__type = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>]'
prog.cpp:17:87:   required from 'struct tuple_type_cat<std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:66:141:   required from 'struct tuple_prune<std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:77:121:   required from here
/usr/include/c++/5/tuple:838:5: note: candidate: template<unsigned int __i, class ... _Elements> constexpr std::__tuple_element_t<__i, std::tuple<_Elements ...> >& std::get(const std::tuple<_Elements ...>&)
     get(const tuple<_Elements...>& __t) noexcept
     ^
/usr/include/c++/5/tuple:838:5: note:   template argument deduction/substitution failed:
/usr/include/c++/5/tuple: In substitution of 'template<unsigned int __i, class ... _Elements> constexpr std::__tuple_element_t<__i, std::tuple<_Elements ...> >& std::get(const std::tuple<_Elements ...>&) [with unsigned int __i = 0u; _Elements = {void, void, Test, void, Test, Test}]':
/usr/include/c++/5/tuple:1095:24:   required from 'static constexpr _Ret std::__tuple_concater<_Ret, std::_Index_tuple<_Is ...>, _Tp, _Tpls ...>::_S_do(_Tp&&, _Tpls&& ..., _Us&& ...) [with _Us = {std::tuple<>}; _Ret = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>; unsigned int ..._Is = 0u, 1u, 2u, 3u, 4u, 5u; _Tp = std::tuple<void, void, Test, void, Test, Test>; _Tpls = {}]'
/usr/include/c++/5/tuple:1093:24:   required from 'static constexpr _Ret std::__tuple_concater<_Ret, std::_Index_tuple<_Is ...>, _Tp, _Tpls ...>::_S_do(_Tp&&, _Tpls&& ..., _Us&& ...) [with _Us = {}; _Ret = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>; unsigned int ..._Is = {0u}; _Tp = std::tuple<std::tuple<> >; _Tpls = {std::tuple<void, void, Test, void, Test, Test>}]'
/usr/include/c++/5/tuple:1120:31:   required from 'constexpr typename std::__tuple_cat_result<_Tpls ...>::__type std::tuple_cat(_Tpls&& ...) [with _Tpls = {std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test>}; <template-parameter-1-2> = void; typename std::__tuple_cat_result<_Tpls ...>::__type = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>]'
prog.cpp:17:87:   required from 'struct tuple_type_cat<std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:66:141:   required from 'struct tuple_prune<std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:77:121:   required from here
/usr/include/c++/5/tuple:838:5: error: forming reference to void
/usr/include/c++/5/tuple: In instantiation of 'static constexpr _Ret std::__tuple_concater<_Ret, std::_Index_tuple<_Is ...>, _Tp, _Tpls ...>::_S_do(_Tp&&, _Tpls&& ..., _Us&& ...) [with _Us = {std::tuple<>}; _Ret = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>; unsigned int ..._Is = 0u, 1u, 2u, 3u, 4u, 5u; _Tp = std::tuple<void, void, Test, void, Test, Test>; _Tpls = {}]':
/usr/include/c++/5/tuple:1093:24:   required from 'static constexpr _Ret std::__tuple_concater<_Ret, std::_Index_tuple<_Is ...>, _Tp, _Tpls ...>::_S_do(_Tp&&, _Tpls&& ..., _Us&& ...) [with _Us = {}; _Ret = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>; unsigned int ..._Is = {0u}; _Tp = std::tuple<std::tuple<> >; _Tpls = {std::tuple<void, void, Test, void, Test, Test>}]'
/usr/include/c++/5/tuple:1120:31:   required from 'constexpr typename std::__tuple_cat_result<_Tpls ...>::__type std::tuple_cat(_Tpls&& ...) [with _Tpls = {std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test>}; <template-parameter-1-2> = void; typename std::__tuple_cat_result<_Tpls ...>::__type = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>]'
prog.cpp:17:87:   required from 'struct tuple_type_cat<std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:66:141:   required from 'struct tuple_prune<std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:77:121:   required from here
/usr/include/c++/5/tuple:844:5: note: candidate: template<unsigned int __i, class ... _Elements> constexpr std::__tuple_element_t<__i, std::tuple<_Elements ...> >&& std::get(std::tuple<_Elements ...>&&)
     get(tuple<_Elements...>&& __t) noexcept
     ^
/usr/include/c++/5/tuple:844:5: note:   template argument deduction/substitution failed:
/usr/include/c++/5/tuple: In substitution of 'template<unsigned int __i, class ... _Elements> constexpr std::__tuple_element_t<__i, std::tuple<_Elements ...> >&& std::get(std::tuple<_Elements ...>&&) [with unsigned int __i = 0u; _Elements = {void, void, Test, void, Test, Test}]':
/usr/include/c++/5/tuple:1095:24:   required from 'static constexpr _Ret std::__tuple_concater<_Ret, std::_Index_tuple<_Is ...>, _Tp, _Tpls ...>::_S_do(_Tp&&, _Tpls&& ..., _Us&& ...) [with _Us = {std::tuple<>}; _Ret = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>; unsigned int ..._Is = 0u, 1u, 2u, 3u, 4u, 5u; _Tp = std::tuple<void, void, Test, void, Test, Test>; _Tpls = {}]'
/usr/include/c++/5/tuple:1093:24:   required from 'static constexpr _Ret std::__tuple_concater<_Ret, std::_Index_tuple<_Is ...>, _Tp, _Tpls ...>::_S_do(_Tp&&, _Tpls&& ..., _Us&& ...) [with _Us = {}; _Ret = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>; unsigned int ..._Is = {0u}; _Tp = std::tuple<std::tuple<> >; _Tpls = {std::tuple<void, void, Test, void, Test, Test>}]'
/usr/include/c++/5/tuple:1120:31:   required from 'constexpr typename std::__tuple_cat_result<_Tpls ...>::__type std::tuple_cat(_Tpls&& ...) [with _Tpls = {std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test>}; <template-parameter-1-2> = void; typename std::__tuple_cat_result<_Tpls ...>::__type = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>]'
prog.cpp:17:87:   required from 'struct tuple_type_cat<std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:66:141:   required from 'struct tuple_prune<std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:77:121:   required from here
/usr/include/c++/5/tuple:844:5: error: forming reference to void
/usr/include/c++/5/tuple: In instantiation of 'static constexpr _Ret std::__tuple_concater<_Ret, std::_Index_tuple<_Is ...>, _Tp, _Tpls ...>::_S_do(_Tp&&, _Tpls&& ..., _Us&& ...) [with _Us = {std::tuple<>}; _Ret = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>; unsigned int ..._Is = 0u, 1u, 2u, 3u, 4u, 5u; _Tp = std::tuple<void, void, Test, void, Test, Test>; _Tpls = {}]':
/usr/include/c++/5/tuple:1093:24:   required from 'static constexpr _Ret std::__tuple_concater<_Ret, std::_Index_tuple<_Is ...>, _Tp, _Tpls ...>::_S_do(_Tp&&, _Tpls&& ..., _Us&& ...) [with _Us = {}; _Ret = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>; unsigned int ..._Is = {0u}; _Tp = std::tuple<std::tuple<> >; _Tpls = {std::tuple<void, void, Test, void, Test, Test>}]'
/usr/include/c++/5/tuple:1120:31:   required from 'constexpr typename std::__tuple_cat_result<_Tpls ...>::__type std::tuple_cat(_Tpls&& ...) [with _Tpls = {std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test>}; <template-parameter-1-2> = void; typename std::__tuple_cat_result<_Tpls ...>::__type = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>]'
prog.cpp:17:87:   required from 'struct tuple_type_cat<std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:66:141:   required from 'struct tuple_prune<std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:77:121:   required from here
/usr/include/c++/5/tuple:867:5: note: candidate: template<class _Tp, class ... _Types> constexpr _Tp& std::get(std::tuple<_Elements ...>&)
     get(tuple<_Types...>& __t) noexcept
     ^
/usr/include/c++/5/tuple:867:5: note:   template argument deduction/substitution failed:
/usr/include/c++/5/tuple:873:5: note: candidate: template<class _Tp, class ... _Types> constexpr _Tp&& std::get(std::tuple<_Elements ...>&&)
     get(tuple<_Types...>&& __t) noexcept
     ^
/usr/include/c++/5/tuple:873:5: note:   template argument deduction/substitution failed:
/usr/include/c++/5/tuple:879:5: note: candidate: template<class _Tp, class ... _Types> constexpr const _Tp& std::get(const std::tuple<_Elements ...>&)
     get(const tuple<_Types...>& __t) noexcept
     ^
/usr/include/c++/5/tuple:879:5: note:   template argument deduction/substitution failed:
/usr/include/c++/5/tuple: In instantiation of 'constexpr std::_Tuple_impl<_Idx, _Head, _Tail ...>::_Tuple_impl(std::_Tuple_impl<_Idx, _Head, _Tail ...>&&) [with unsigned int _Idx = 1u; _Head = void; _Tail = {void, Test, void, Test, Test}]':
/usr/include/c++/5/type_traits:1162:12:   required from 'struct std::__is_nt_constructible_impl<std::_Tuple_impl<1u, void, void, Test, void, Test, Test>, std::_Tuple_impl<1u, void, void, Test, void, Test, Test>&&>'
/usr/include/c++/5/type_traits:137:12:   required from 'struct std::__and_<std::is_constructible<std::_Tuple_impl<1u, void, void, Test, void, Test, Test>, std::_Tuple_impl<1u, void, void, Test, void, Test, Test>&&>, std::__is_nt_constructible_impl<std::_Tuple_impl<1u, void, void, Test, void, Test, Test>, std::_Tuple_impl<1u, void, void, Test, void, Test, Test>&&> >'
/usr/include/c++/5/type_traits:1174:12:   required from 'struct std::is_nothrow_constructible<std::_Tuple_impl<1u, void, void, Test, void, Test, Test>, std::_Tuple_impl<1u, void, void, Test, void, Test, Test>&&>'
/usr/include/c++/5/type_traits:1205:12:   required from 'struct std::__is_nothrow_move_constructible_impl<std::_Tuple_impl<1u, void, void, Test, void, Test, Test>, true>'
/usr/include/c++/5/type_traits:1211:12:   [ skipping 2 instantiation contexts, use -ftemplate-backtrace-limit=0 to disable ]
/usr/include/c++/5/tuple:218:7:   required from 'constexpr std::_Tuple_impl<_Idx, _Head, _Tail ...>::_Tuple_impl(std::_Tuple_impl<_Idx, _Head, _Tail ...>&&) [with unsigned int _Idx = 0u; _Head = std::tuple<>; _Tail = {void, void, Test, void, Test, Test}]'
/usr/include/c++/5/tuple:1095:52:   required from 'static constexpr _Ret std::__tuple_concater<_Ret, std::_Index_tuple<_Is ...>, _Tp, _Tpls ...>::_S_do(_Tp&&, _Tpls&& ..., _Us&& ...) [with _Us = {}; _Ret = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>; unsigned int ..._Is = {0u}; _Tp = std::tuple<std::tuple<> >; _Tpls = {std::tuple<void, void, Test, void, Test, Test>}]'
/usr/include/c++/5/tuple:1120:31:   required from 'constexpr typename std::__tuple_cat_result<_Tpls ...>::__type std::tuple_cat(_Tpls&& ...) [with _Tpls = {std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test>}; <template-parameter-1-2> = void; typename std::__tuple_cat_result<_Tpls ...>::__type = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>]'
prog.cpp:17:87:   required from 'struct tuple_type_cat<std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:66:141:   required from 'struct tuple_prune<std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:77:121:   required from here
/usr/include/c++/5/tuple:222:27: error: no matching function for call to 'forward(Test&)'
  _Base(std::forward<_Head>(_M_head(__in))) { }
                           ^
In file included from /usr/include/c++/5/bits/stl_pair.h:59:0,
                 from /usr/include/c++/5/bits/stl_algobase.h:64,
                 from /usr/include/c++/5/bits/char_traits.h:39,
                 from /usr/include/c++/5/ios:40,
                 from /usr/include/c++/5/ostream:38,
                 from /usr/include/c++/5/iostream:39,
                 from prog.cpp:1:
/usr/include/c++/5/bits/move.h:76:5: note: candidate: template<class _Tp> constexpr _Tp&& std::forward(typename std::remove_reference<_From>::type&)
     forward(typename std::remove_reference<_Tp>::type& __t) noexcept
     ^
/usr/include/c++/5/bits/move.h:76:5: note:   template argument deduction/substitution failed:
/usr/include/c++/5/bits/move.h: In substitution of 'template<class _Tp> constexpr _Tp&& std::forward(typename std::remove_reference<_From>::type&) [with _Tp = void]':
/usr/include/c++/5/tuple:222:27:   required from 'constexpr std::_Tuple_impl<_Idx, _Head, _Tail ...>::_Tuple_impl(std::_Tuple_impl<_Idx, _Head, _Tail ...>&&) [with unsigned int _Idx = 1u; _Head = void; _Tail = {void, Test, void, Test, Test}]'
/usr/include/c++/5/type_traits:1162:12:   required from 'struct std::__is_nt_constructible_impl<std::_Tuple_impl<1u, void, void, Test, void, Test, Test>, std::_Tuple_impl<1u, void, void, Test, void, Test, Test>&&>'
/usr/include/c++/5/type_traits:137:12:   required from 'struct std::__and_<std::is_constructible<std::_Tuple_impl<1u, void, void, Test, void, Test, Test>, std::_Tuple_impl<1u, void, void, Test, void, Test, Test>&&>, std::__is_nt_constructible_impl<std::_Tuple_impl<1u, void, void, Test, void, Test, Test>, std::_Tuple_impl<1u, void, void, Test, void, Test, Test>&&> >'
/usr/include/c++/5/type_traits:1174:12:   required from 'struct std::is_nothrow_constructible<std::_Tuple_impl<1u, void, void, Test, void, Test, Test>, std::_Tuple_impl<1u, void, void, Test, void, Test, Test>&&>'
/usr/include/c++/5/type_traits:1205:12:   required from 'struct std::__is_nothrow_move_constructible_impl<std::_Tuple_impl<1u, void, void, Test, void, Test, Test>, true>'
/usr/include/c++/5/type_traits:1211:12:   [ skipping 2 instantiation contexts, use -ftemplate-backtrace-limit=0 to disable ]
/usr/include/c++/5/tuple:218:7:   required from 'constexpr std::_Tuple_impl<_Idx, _Head, _Tail ...>::_Tuple_impl(std::_Tuple_impl<_Idx, _Head, _Tail ...>&&) [with unsigned int _Idx = 0u; _Head = std::tuple<>; _Tail = {void, void, Test, void, Test, Test}]'
/usr/include/c++/5/tuple:1095:52:   required from 'static constexpr _Ret std::__tuple_concater<_Ret, std::_Index_tuple<_Is ...>, _Tp, _Tpls ...>::_S_do(_Tp&&, _Tpls&& ..., _Us&& ...) [with _Us = {}; _Ret = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>; unsigned int ..._Is = {0u}; _Tp = std::tuple<std::tuple<> >; _Tpls = {std::tuple<void, void, Test, void, Test, Test>}]'
/usr/include/c++/5/tuple:1120:31:   required from 'constexpr typename std::__tuple_cat_result<_Tpls ...>::__type std::tuple_cat(_Tpls&& ...) [with _Tpls = {std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test>}; <template-parameter-1-2> = void; typename std::__tuple_cat_result<_Tpls ...>::__type = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>]'
prog.cpp:17:87:   required from 'struct tuple_type_cat<std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:66:141:   required from 'struct tuple_prune<std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:77:121:   required from here
/usr/include/c++/5/bits/move.h:76:5: error: forming reference to void
/usr/include/c++/5/tuple: In instantiation of 'constexpr std::_Tuple_impl<_Idx, _Head, _Tail ...>::_Tuple_impl(std::_Tuple_impl<_Idx, _Head, _Tail ...>&&) [with unsigned int _Idx = 1u; _Head = void; _Tail = {void, Test, void, Test, Test}]':
/usr/include/c++/5/type_traits:1162:12:   required from 'struct std::__is_nt_constructible_impl<std::_Tuple_impl<1u, void, void, Test, void, Test, Test>, std::_Tuple_impl<1u, void, void, Test, void, Test, Test>&&>'
/usr/include/c++/5/type_traits:137:12:   required from 'struct std::__and_<std::is_constructible<std::_Tuple_impl<1u, void, void, Test, void, Test, Test>, std::_Tuple_impl<1u, void, void, Test, void, Test, Test>&&>, std::__is_nt_constructible_impl<std::_Tuple_impl<1u, void, void, Test, void, Test, Test>, std::_Tuple_impl<1u, void, void, Test, void, Test, Test>&&> >'
/usr/include/c++/5/type_traits:1174:12:   required from 'struct std::is_nothrow_constructible<std::_Tuple_impl<1u, void, void, Test, void, Test, Test>, std::_Tuple_impl<1u, void, void, Test, void, Test, Test>&&>'
/usr/include/c++/5/type_traits:1205:12:   required from 'struct std::__is_nothrow_move_constructible_impl<std::_Tuple_impl<1u, void, void, Test, void, Test, Test>, true>'
/usr/include/c++/5/type_traits:1211:12:   [ skipping 2 instantiation contexts, use -ftemplate-backtrace-limit=0 to disable ]
/usr/include/c++/5/tuple:218:7:   required from 'constexpr std::_Tuple_impl<_Idx, _Head, _Tail ...>::_Tuple_impl(std::_Tuple_impl<_Idx, _Head, _Tail ...>&&) [with unsigned int _Idx = 0u; _Head = std::tuple<>; _Tail = {void, void, Test, void, Test, Test}]'
/usr/include/c++/5/tuple:1095:52:   required from 'static constexpr _Ret std::__tuple_concater<_Ret, std::_Index_tuple<_Is ...>, _Tp, _Tpls ...>::_S_do(_Tp&&, _Tpls&& ..., _Us&& ...) [with _Us = {}; _Ret = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>; unsigned int ..._Is = {0u}; _Tp = std::tuple<std::tuple<> >; _Tpls = {std::tuple<void, void, Test, void, Test, Test>}]'
/usr/include/c++/5/tuple:1120:31:   required from 'constexpr typename std::__tuple_cat_result<_Tpls ...>::__type std::tuple_cat(_Tpls&& ...) [with _Tpls = {std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test>}; <template-parameter-1-2> = void; typename std::__tuple_cat_result<_Tpls ...>::__type = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>]'
prog.cpp:17:87:   required from 'struct tuple_type_cat<std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:66:141:   required from 'struct tuple_prune<std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:77:121:   required from here
/usr/include/c++/5/bits/move.h:87:5: note: candidate: template<class _Tp> constexpr _Tp&& std::forward(typename std::remove_reference<_From>::type&&)
     forward(typename std::remove_reference<_Tp>::type&& __t) noexcept
     ^
/usr/include/c++/5/bits/move.h:87:5: note:   template argument deduction/substitution failed:
/usr/include/c++/5/bits/move.h: In substitution of 'template<class _Tp> constexpr _Tp&& std::forward(typename std::remove_reference<_From>::type&&) [with _Tp = void]':
/usr/include/c++/5/tuple:222:27:   required from 'constexpr std::_Tuple_impl<_Idx, _Head, _Tail ...>::_Tuple_impl(std::_Tuple_impl<_Idx, _Head, _Tail ...>&&) [with unsigned int _Idx = 1u; _Head = void; _Tail = {void, Test, void, Test, Test}]'
/usr/include/c++/5/type_traits:1162:12:   required from 'struct std::__is_nt_constructible_impl<std::_Tuple_impl<1u, void, void, Test, void, Test, Test>, std::_Tuple_impl<1u, void, void, Test, void, Test, Test>&&>'
/usr/include/c++/5/type_traits:137:12:   required from 'struct std::__and_<std::is_constructible<std::_Tuple_impl<1u, void, void, Test, void, Test, Test>, std::_Tuple_impl<1u, void, void, Test, void, Test, Test>&&>, std::__is_nt_constructible_impl<std::_Tuple_impl<1u, void, void, Test, void, Test, Test>, std::_Tuple_impl<1u, void, void, Test, void, Test, Test>&&> >'
/usr/include/c++/5/type_traits:1174:12:   required from 'struct std::is_nothrow_constructible<std::_Tuple_impl<1u, void, void, Test, void, Test, Test>, std::_Tuple_impl<1u, void, void, Test, void, Test, Test>&&>'
/usr/include/c++/5/type_traits:1205:12:   required from 'struct std::__is_nothrow_move_constructible_impl<std::_Tuple_impl<1u, void, void, Test, void, Test, Test>, true>'
/usr/include/c++/5/type_traits:1211:12:   [ skipping 2 instantiation contexts, use -ftemplate-backtrace-limit=0 to disable ]
/usr/include/c++/5/tuple:218:7:   required from 'constexpr std::_Tuple_impl<_Idx, _Head, _Tail ...>::_Tuple_impl(std::_Tuple_impl<_Idx, _Head, _Tail ...>&&) [with unsigned int _Idx = 0u; _Head = std::tuple<>; _Tail = {void, void, Test, void, Test, Test}]'
/usr/include/c++/5/tuple:1095:52:   required from 'static constexpr _Ret std::__tuple_concater<_Ret, std::_Index_tuple<_Is ...>, _Tp, _Tpls ...>::_S_do(_Tp&&, _Tpls&& ..., _Us&& ...) [with _Us = {}; _Ret = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>; unsigned int ..._Is = {0u}; _Tp = std::tuple<std::tuple<> >; _Tpls = {std::tuple<void, void, Test, void, Test, Test>}]'
/usr/include/c++/5/tuple:1120:31:   required from 'constexpr typename std::__tuple_cat_result<_Tpls ...>::__type std::tuple_cat(_Tpls&& ...) [with _Tpls = {std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test>}; <template-parameter-1-2> = void; typename std::__tuple_cat_result<_Tpls ...>::__type = std::tuple<std::tuple<>, void, void, Test, void, Test, Test>]'
prog.cpp:17:87:   required from 'struct tuple_type_cat<std::tuple<std::tuple<> >, std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:66:141:   required from 'struct tuple_prune<std::tuple<void, void, Test, void, Test, Test> >'
prog.cpp:77:121:   required from here
/usr/include/c++/5/bits/move.h:87:5: error: forming reference to void
In file included from prog.cpp:2:0:
/usr/include/c++/5/tuple: In instantiation of 'constexpr std::_Tuple_impl<_Idx, _Head, _Tail ...>::_Tuple_impl(std::_Tuple_impl<_Idx, _Head, _Tail ...>&&) [with unsigned int _Idx = 2u; _Head = void; _Tail = {Test, void, Test, Test}]':
/usr/include/c++/5/tuple:222:42:   required from 'constexpr std::_Tuple_impl<_Idx, _Head, _Tail ...>::_Tuple_impl(std::_Tuple_impl<_Idx, _Head, _Tail ...>&&) [with unsigned int _Idx = 1u; _Head = void; _Tail = {void, Test, void, Test, Test}]'
/usr/include/c++/5/type_traits:1162:12:   required from 'struct std::__is_nt_constructible_impl<std::_Tuple_impl<1u, void, void, Test, void, Test, Test>, std::_Tuple_impl<1u, void, void, Test, void, Test, Test>&&>'
/usr/include/c++/5/type_traits:137:12:   required from 'struct std::__and_<std::is_constructible<std::_Tuple_impl<1u, void, voi
stdout
Standard output is empty