我正在写一个简化函数模板风格的演绎指南,但我不确定是否允许,它在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);
}
1条答案
按热度按时间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)中的陈述,即演绎向导的参数列表遵循与函数声明相同的限制。