gpt4 book ai didi

c++ - 明确指定的模板参数包

转载 作者:行者123 更新时间:2023-12-02 10:30:56 24 4
gpt4 key购买 nike

假设我有以下代码:

#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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com