显式指定位于模板参数包之后的默认模板参数
Explicitly specify defaulted template parameter located after template parameter pack
为什么我不能在以下情况下明确指定 d
?
#include <iostream>
template< typename a, typename b = int, typename ...c, typename d = int >
int
f(a, b, c..., d)
{
return sizeof...(c);
}
int
main()
{
std::cout << f< int, int, int, int/*, char*/ >(1, 2, 3, 4, 'd') << std::endl;
return 0;
}
如果我取消注释最后一个模板参数,那么我期望输出 2
,但我得到一个硬错误:
main.cpp:14:18: error: no matching function for call to 'f'
std::cout << f< int, int, int, int, char >(1, 2, 3, 4, 'd') << std::endl;
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
main.cpp:6:1: note: candidate function not viable: requires 6 arguments, but 5 were provided
f(a, b, c..., d)
^
1 error generated.
在这种情况下拒绝它的规则是什么?
因为包是贪婪的。所以 char
实际上是 c
的一部分,你应该提供与 d
相关的参数,由于默认情况下它是 int
类型。
为什么我不能在以下情况下明确指定 d
?
#include <iostream>
template< typename a, typename b = int, typename ...c, typename d = int >
int
f(a, b, c..., d)
{
return sizeof...(c);
}
int
main()
{
std::cout << f< int, int, int, int/*, char*/ >(1, 2, 3, 4, 'd') << std::endl;
return 0;
}
如果我取消注释最后一个模板参数,那么我期望输出 2
,但我得到一个硬错误:
main.cpp:14:18: error: no matching function for call to 'f'
std::cout << f< int, int, int, int, char >(1, 2, 3, 4, 'd') << std::endl;
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
main.cpp:6:1: note: candidate function not viable: requires 6 arguments, but 5 were provided
f(a, b, c..., d)
^
1 error generated.
在这种情况下拒绝它的规则是什么?
因为包是贪婪的。所以 char
实际上是 c
的一部分,你应该提供与 d
相关的参数,由于默认情况下它是 int
类型。