我正在编写一个函数模板
template<typename ...T>
void f(T ...t) {
X x(t...);
// ...
}
当我看着它时,我想知道电话f()
会发生什么。将烦恼解析使x成为函数声明吗?编译器似乎使它成为一个变量。有人可以帮我确定一下吗?
答案 0 :(得分:13)
空括号(()
)只有在源代码中这样写成时才会使它成为函数声明。
§14.5.3 [temp.variadic] p6
也提到了这一点:
不是sizeof ...表达式的包扩展的实例化产生列表E1,E2,...,EN,其中N是包扩展参数中的元素数。 [...]当N为零时,扩展的实例化会产生一个空列表。 这样的实例化不会改变封闭结构的句法解释,即使在完全省略列表否则会形成错误或会导致语法模糊的情况下。 [示例:
template<class... T> struct X : T... { }; template<class... T> void f(T... values) { X<T...> x(values...); } template void f<>(); // OK: X<> has no base classes // x is a variable of type X<> that is value-initialized
- 示例]
具体参见示例代码中的第二条评论。