我很难理解以下内容。为什么这段代码编译
template <size_t N, size_t... N_i, size_t... M_i>
auto foo2(std::index_sequence<M_i...> = std::make_index_sequence<N>())
{
constexpr size_t values[] = {N_i...};
return A<values[M_i]...>();
}
template <size_t N,size_t... N_i>
auto foo()
{
return foo2<N,N_i...>(std::make_index_sequence<N>());
}
int main()
{
foo<2, 1,2,3>();
}
但这不是(我使用默认参数foo2
):
template <size_t N, size_t... N_i, size_t... M_i>
auto foo2(std::index_sequence<M_i...> = std::make_index_sequence<N>())
{
constexpr size_t values[] = {N_i...};
return A<values[M_i]...>();
}
template <size_t N,size_t... N_i>
auto foo()
{
return foo2<N,N_i...>();
}
int main()
{
foo<2, 1,2,3>();
}
非常感谢提前。
答案 0 :(得分:4)
假设:
template <size_t N, size_t... N_i, size_t... M_i>
auto foo2(std::index_sequence<M_i...> = std::make_index_sequence<N>());
您无法明确指定M_i
(因为序列只会被N_i
的一部分吞没)。如果指定参数,则编译器可以使用模板参数推导来计算出M_i
是什么。如果你没有指定一个参数,那么编译器无法推断出M_i
是什么(并且它需要知道它才能开始决定你需要一个默认参数,并且那个论点是什么。)
假设这是较大整体的一小部分,那么修复就是写
template <size_t N, size_t... N_i, size_t... M_i>
auto foo2(std::index_sequence<M_i...>)
{
constexpr size_t values[] = {N_i...};
return A<values[M_i]...>();
}
template <size_t N,size_t... N_i>
auto foo2()
{
return foo2<N,N_i...>(std::make_index_sequence<N>());
}
然后你确实可以写:
template <size_t N,size_t... N_i>
auto foo()
{
return foo2<N,N_i...>();
}