c++ 用户定义类模板参数推导指南的缩写函数模板语法

e0bqpujr  于 2022-12-15  发布在  其他
关注(0)|答案(1)|浏览(133)

我正在写一个简化函数模板风格的演绎指南,但我不确定是否允许,它在gcc和clang上编译,但不在msvc上编译。
错误为:
错误C3539:模板参数不能是包含“auto”的类型
哪个编译器做的是正确的?
在这里试试

template <typename Type, int Count>
struct Array
{
    Type data[Count];

    Array (auto ... arg)
    {
        int count = 0;
        ((data[count++] = arg),...);
    }
};

// abbreviated function template syntax - fails in msvc
Array (auto first, auto ... next) -> Array<decltype(first), 1 + sizeof...(next)>;

// regular syntax
// template <typename Type, typename ... Args> Array (Type first, Args ... next) -> Array<Type, 1 + sizeof...(Args)>;

int main ()
{
    Array a(1,2,3);
}
pbpqsu0x

pbpqsu0x1#

根据[dcl.spec.auto.general]/6,不允许使用[dcl.spec.auto]中未明确允许的占位符类型(例如auto)。
我没有看到任何适用于这里提到的推导指南的东西,特别是[dcl.spec.auto.general]/2,它允许在函数参数中使用它,但明确地限制在函数声明和lambda表达式中的参数声明。
所以在我看来它确实是畸形的。
但是我看不出有什么理由,我怀疑[dcl.spec.auto]和[dcl.fct]中的 * abstitued function template* 的定义应该扩展为包含具有类比规则的演绎向导的参数列表,以匹配temp.deduct.guide(https://timsong-cpp.github.io/cppwp/n4868/temp.deduct.guide)中的陈述,即演绎向导的参数列表遵循与函数声明相同的限制。

相关问题