简化的函数模板语法,用于用户定义的类模板参数推导指南



我正在写一个简化函数模板风格的演绎指南,但我不确定它是否被允许。它可以在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);
}

根据[dcl.spec.auto.]任何在[dcl.spec]中没有明确允许的占位符类型(例如auto)的使用。

我没有看到任何适用于这里提到的演绎指南。特别是[dcl.spec.auto.][/2]允许在函数形参中使用,但明确地限制在函数声明和lambda表达式中的形参声明中使用。

所以在我看来它确实是不正确的。

然而,我看不出有任何理由这样做。我怀疑[dcl.spec。[dcl. Auto]和缩写函数模板的定义。应该扩展为包含演绎指南的参数列表,并使用类似的规则来匹配[temp.演绎.guide]中的语句,即演绎指南的参数列表遵循与函数声明相同的限制。

最新更新