2016-11-11 118 views
8

“模板参数推导类模板”建议P0091R2包含以下例子:“类模板的模板参数推导”是否应该推导可变类模板的空参数包?

template<class ... Ts> struct X { X(Ts...) }; 
X x1{1}; // OK X<int> 
X x11; // OK X<> 

(除了事实,即构造定义缺少体),示例似乎暗示用零参数构造的可变类模板将用空参数包推导出来。

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

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 ++在这里错了吗?

+0

'X x11 {};'的作品。 – ildjarn

+1

我想说gcc实现现在处于实验阶段。即'vector v {2,3}'工作,但'vector v {2,3,4}'产生一个错误,'int'不是一个类,struct或union类型。 – krzaq

+0

@krzaq:它似乎试图为该特定情况调用[构造函数(2)](http://en.cppreference.com/w/cpp/container/vector/vector)。我想知道这是否实际上是有意的*(即这些情况下的消歧规则是什么)*。顺便说一下,我知道gcc正处于实验阶段 - 我的兴趣是在适当的时候提交错误报告。 –

回答

8

[dcl.type.class.deduct]/1

如果推断的类型显示一个占位符如在简单声明DECL说明符-SEQ一个 DECL说明符,所述INIT-该声明的声明符应形式

声明符-ID属性符-SEQ选择初始

的初始化是不可选的。

+0

不错。这是一个非常方便的网站! –

+0

那么'X x11 {};'应该可以工作吗? – Yakk

+4

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