应用"类模板的模板参数推导"是否应该为可变参数类模板推导出空参数包?

Vit*_*meo 8 c++ templates language-lawyer template-argument-deduction c++17

"类模板参数推导"的提案(P0091R2)包含以下例子:

template<class ... Ts> struct X { X(Ts...) };
X x1{1}; // OK X<int>
X x11; // OK X<>
Run Code Online (Sandbox Code Playgroud)

(除了构造函数定义缺少一个主体的事实)之外,该示例似乎建议使用空参数包推导出使用零参数构造的可变参数类模板.

不幸的是,最新版本的g ++不同意:

int main()
{
    X x1{1};
    X x11;
}
Run Code Online (Sandbox Code Playgroud)

 In function 'int main()':
 error: invalid use of template-name 'X' without an argument list
 X x11;
 ^
 note: class template argument deduction requires an initializer
Run Code Online (Sandbox Code Playgroud)

wandbox上的示例


我无法在提案中找到明确的措辞来澄清这种互动.这里的g ++错了吗?

T.C*_*.C. 9

P0620R0在C++ 17出版之前删除了所引用的限制之后,现在这已经很好了.

以前的答案一直供参考:


N4618 [dcl.type.class.deduct]/1:

如果推断类类型的占位符在简单声明decl-specifier-seq中显示为 decl-specifier,则该声明init- declarator应为

declarator-id attribute-specifier-seq opt initializer

初始化程序不是可选的.

  • @Yakk是的,虽然它看起来像[他们正在调整的东西](https://twitter.com/AlisdairMered/status/797227816999743490)所以也许我将不得不编辑这个... (4认同)