从std::make_index_sequence推导形参pack时,为什么不能将其用作默认实参? &



为了使模板魔力尽可能深入我的代码,我想使用std::make_index_sequence作为默认参数,但这似乎无法编译,我不太明白为什么会这样。

作为一个没有默认参数的例子,它会编译(请记住,这是一个简化的例子,不是我的实际用例):

#include <utility>
template <std::size_t... TIndicies>
std::size_t FunctNoDefaultArgs(std::index_sequence<TIndicies...>)
{
return (TIndicies + ... + 0);
}
int main()
{
return FunctNoDefaultArgs(std::make_index_sequence<5>{});
}

运行正常

所以我想把std::make_index_sequence<5>{}作为一个默认参数,并做以下操作:

#include <utility>
template <std::size_t... TIndicies>
std::size_t FunctDefaultArgs(std::index_sequence<TIndicies...> = std::make_index_sequence<5>{})
{
return (TIndicies + ... + 0);
}
int main()
{
return FunctDefaultArgs();
}

在MSVC、Clang或gcc中都无法编译。有人能解释一下原因吗?

CompilerExplorer

模板参数推导是这里的首要任务。你必须弄清楚到底是什么在你开始担心它的参数之前,你正在调用它吗?

FunctDefaultArgs();

好的,这里的模板参数是什么?你不能推导出来。没有什么可推断的。这是完全有可能的,例如,一些特定的模板参数集将结束于具有完全不同参数(默认或非默认)的模板专门化。

在做任何事情之前,必须首先推导模板参数。

幸运的是,产生相同结果的解决方案很简单。它应该只是一个额外的声明/定义:

inline auto FunctNoDefaultArgs()
{
return FunctNoDefaultArgs(std::make_index_sequence<5>{});
}

最新更新