gpt4 book ai didi

c++ - 具有包扩展的可变参数函数模板不在最后一个参数中

转载 作者:IT老高 更新时间:2023-10-28 22:37:33 26 4
gpt4 key购买 nike

我想知道为什么下面的代码不能编译:

struct S
{
template <typename... T>
S(T..., int);
};

S c{0, 0};

此代码无法使用 clang 和 GCC 4.8 编译。这是 clang 的错误:

test.cpp:7:3: error: no matching constructor for initialization of 'S'
S c{0, 0};
^~~~~~~
test.cpp:4:5: note: candidate constructor not viable: requires 1 argument, but 2 were provided
S(T..., int);
^

在我看来这应该可行,并且 T 应该被推断为长度为 1 的包。

如果标准禁止这样做,有谁知道为什么?

最佳答案

因为当函数形参包不是最后一个形参时,不能从中推导出模板形参包,模板实参推导将忽略它。

所以两个参数 0, 0, int 进行比较,结果不匹配。

像这样的推导规则需要涵盖许多特殊情况(例如当两个参数包彼此相邻出现时会发生什么)。由于参数包是 C++11 中的一项新功能,因此相应提案的作者保守地起草了规则。

请注意,如果没有以其他方式推导,尾随模板参数包将为空。所以当你用一个参数调用构造函数时,事情就会起作用(注意这里模板参数包和函数参数包的区别。前者是尾随,后者不是)。

关于c++ - 具有包扩展的可变参数函数模板不在最后一个参数中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14768951/

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