【发布时间】:2017-02-06 08:14:21
【问题描述】:
考虑这段代码:
template<typename FirstArg>
void foo()
{
}
template<typename FirstArg, typename... RestOfArgs>
void foo()
{
foo<RestOfArgs...>();
}
int main()
{
foo<int, int, int>();
return 0;
}
当RestOfArgs只有一个元素({int})时,由于不明确的调用foo<RestOfArgs...>();而无法编译。
但这编译没有错误:
template<typename FirstArg>
void foo(FirstArg x)
{
}
template<typename FirstArg, typename... RestOfArgs>
void foo(FirstArg x, RestOfArgs... y)
{
foo(y...);
}
int main()
{
foo<int, int, int>(5, 6, 7);
return 0;
}
为什么第一种情况有歧义?
为什么第二种情况没有歧义?
【问题讨论】:
-
我的假设是它与函数的签名是它的参数这一事实有关,
<int>和<int>在一种情况下是无法区分的,但在另一种情况下是为什么。跨度> -
@Jarod42 我看了但还是不知道我的问题的答案。
-
@rubix_addict:我同意这从给定的链接中并不明显。我在答案中强调了这一点。
标签: c++ variadic-templates overload-resolution