X x(t ...)能否导致带有烦恼解析的函数声明?

时间:2012-10-23 07:32:22

标签: c++ templates c++11 variadic-templates

我正在编写一个函数模板

template<typename ...T>
void f(T ...t) {
  X x(t...);
  // ...
}

当我看着它时,我想知道电话f()会发生什么。将烦恼解析使x成为函数声明吗?编译器似乎使它成为一个变量。有人可以帮我确定一下吗?

1 个答案:

答案 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
     

- 示例]

具体参见示例代码中的第二条评论。