gpt4 book ai didi

c++ - 非尾随函数模板参数包的合法使用?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:22:44 24 4
gpt4 key购买 nike

在调试某人讨厌的宏生成代码时,我看到 MSVC++ 本身并不满意类似于以下函数模板声明的内容:

template <typename ...Vs, typename>
void foo();

很公平。我很困惑为什么 GCC 和 Clang 会编译它。我在上面的声明中添加了 foo 的定义,现在 GCC 也产生了编译错误(Clang 仍然是内容)。此代码如下:

template <typename ...Vs, typename>
void foo();

template <typename ...Vs, typename = int>
void foo() { }

int main(int argc, char *argv[])
{
foo<char,float>();
return 0;
}

Clang 是对还是错?我注意到如果删除声明,GCC 和 MSVC++ 可以编译。

最佳答案

Clang 是正确的。模板parameter pack如果以下参数具有默认参数,则可能会更早出现。

In a primary class template, the template parameter pack must be the final parameter in the template parameter list. In a function template, the template parameter pack may appear earlier in the list provided that all following parameters can be deduced from the function arguments, or have default arguments:

template<typename... Ts, typename U> struct Invalid; // Error: Ts.. not at the end

template<typename ...Ts, typename U, typename=void>
void valid(U, Ts...); // OK: can deduce U
// void valid(Ts..., U); // Can't be used: Ts... is a non-deduced context in this position

valid(1.0, 1, 2, 3); // OK: deduces U as double, Ts as {int,int,int}

然后给出foo<char,float>(); , Vs推导为 char, float ,第二个模板参数将是 int .

来自标准,[temp.param]/13

If a template-parameter of a primary class template, primary variable template, or alias template is a template parameter pack, it shall be the last template-parameter. A template parameter pack of a function template shall not be followed by another template parameter unless that template parameter can be deduced from the parameter-type-list ([dcl.fct]) of the function template or has a default argument ([temp.deduct]).

以及关于 gcc 和 msvc 的行为,

GCC and MSVC++ will successfully compile if the declaration is removed.

Gcc 和 MSVC 似乎无法合并 default template arguments , 出现在声明和定义中的应该合并。

Default template arguments that appear in the declarations and the definition are merged similarly to default function arguments:

template<typename T1, typename T2 = int> class A;
template<typename T1 = int, typename T2> class A;
// the above is the same as the following:
template<typename T1 = int, typename T2 = int> class A;

关于c++ - 非尾随函数模板参数包的合法使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57312188/

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