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

Joh*_*itb 15 c++ templates variadic-templates c++11

我正在编写一个函数模板

template<typename ...T>
void f(T ...t) {
  X x(t...);
  // ...
}
Run Code Online (Sandbox Code Playgroud)

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

Xeo*_*Xeo 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
Run Code Online (Sandbox Code Playgroud)

- 末端的例子 ]

具体请参见示例代码中的第二条注释.