假设我有以下代码:
#include <iostream>
template <size_t... Is> struct E {};
template <typename... Ts, size_t... Is>
void func (E<Is...>, Ts...) {std::cout << __PRETTY_FUNCTION__ << std::endl;}
int main()
{
func(E<1,2,3>{}, 1, 'a');
}
它可以完美地工作并产生
void func(E<Is ...>, Ts ...) [with Ts = {int, char}; long unsigned int ...Is = {1, 2, 3}]
但是,如果我将
func
调用替换为func<int, char, 1, 2, 3>(E<1,2,3>{}, 1, 'a');
,则会导致编译错误,即template argument deduction/substitution failed
为什么编译器禁止显式指定多个参数包?
最佳答案
这遵循模板自变量推导的规则。
当您显式指定func
的模板参数时,编译器会贪婪地将其匹配到第一个参数包。编译器无法确定一旦将int
放入参数中,它就应该开始替换Is...
。
相反,它将继续替换Ts...
,并且您将收到以下错误消息:
expected a type, but got 1
用于第三个明确指定的参数。
如果仅指定
Ts...
,则可以看到以下内容:func<int, char>(E<1,2,3>{}, 1, 'a');
编译就好了。
关于c++ - 明确指定的模板参数包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62305390/