"模板参数扣除类模板" 投标(P0091R2)包含以下示例:
template<class ... Ts> struct X { X(Ts...) };
X x1{1}; // OK X<int>
X x11; // OK X<>
(除了构造函数定义缺少一个正文)之外,该示例似乎表明将使用零参数构造的可变参数类模板将推导出一个空的参数包。
不幸的是, g ++ 的最新版本不同意:
int main()
{
X x1{1};
X x11;
}
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
我无法在提案中找到明确的措辞来澄清这种互动。这里的g ++错了吗?
答案 0 :(得分:9)
在P0620R0在C ++ 17发布之前删除引用的限制之后,现在已经很好了。
以前的答案一直供参考:
N4618 [dcl.type.class.deduct]/1:
如果推断的类类型的占位符显示为 简单声明的 decl-specifier-seq 中的 decl-specifier , init-declarator 声明应为
形式declarator-id attribute-specifier-seq opt initializer
初始值设定项不是可选的。