The following code compiles with gcc and clang but fails with icc.
#include <tuple> #include <utility> template<class, class> struct right_impl {}; template <std::size_t... Indexes, class... Values> struct right_impl<std::index_sequence<Indexes...>, std::tuple<Values...>> { using type = std::tuple< std::tuple_element_t<sizeof...(Values) - sizeof...(Indexes) + Indexes, std::tuple<Values...>>...>; }; template<int N, class Tuple> using right_t = typename right_impl<std::make_index_sequence<N>, Tuple>::type; int main() { using T1 = std::tuple<int, float, char>; using T2 = right_t<2, T1>; static_assert( std::is_same<T2, std::tuple<float, char>>::value,"type is incorrect"); return 0; }