"template argument deduction for class templates" 是否应该为可变 class 模板推导出空参数包?
Is "template argument deduction for class templates" supposed to deduce empty parameter packs for variadic class templates?
"Template argument deduction for class templates"提案(P0091R2)包含以下示例:
template<class ... Ts> struct X { X(Ts...) };
X x1{1}; // OK X<int>
X x11; // OK X<>
(除了构造函数定义缺少主体这一事实),该示例似乎表明 可变参数 class 模板 用零参数构造的将用空参数包推导。
可惜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++这里是不是错了?
在 P0620R0 删除 C++17 发布之前引用的限制后,现在格式正确。
保留上一个答案供参考:
N4618 [dcl.type.class.deduct]/1:
If a placeholder for a deduced class type appears as a
decl-specifier in the decl-specifier-seq of a simple-declaration, the init-declarator of that declaration shall be of the form
declarator-id attribute-specifier-seqopt initializer
初始化程序不是可选的。
"Template argument deduction for class templates"提案(P0091R2)包含以下示例:
template<class ... Ts> struct X { X(Ts...) };
X x1{1}; // OK X<int>
X x11; // OK X<>
(除了构造函数定义缺少主体这一事实),该示例似乎表明 可变参数 class 模板 用零参数构造的将用空参数包推导。
可惜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++这里是不是错了?
在 P0620R0 删除 C++17 发布之前引用的限制后,现在格式正确。
保留上一个答案供参考:
N4618 [dcl.type.class.deduct]/1:
If a placeholder for a deduced class type appears as a decl-specifier in the decl-specifier-seq of a simple-declaration, the init-declarator of that declaration shall be of the form
declarator-id attribute-specifier-seqopt initializer
初始化程序不是可选的。