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

时间:2016-11-11 21:55:03

标签: c++ templates language-lawyer c++17 template-deduction

"模板参数扣除类模板" 投标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

example on wandbox

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

1 个答案:

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

  

初始值设定项不是可选的。