【发布时间】:2016-11-11 21:55:03
【问题描述】:
“类模板的模板参数推导”提案(P0091R2)包含以下示例:
template<class ... Ts> struct X { X(Ts...) };
X x1{1}; // OK X<int>
X x11; // OK X<>
(除了构造函数定义缺少一个主体),这个例子似乎暗示了一个用零参数构造的variadic class template将被推导出来一个空的参数包。
很遗憾,最新版本的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++错了吗?
【问题讨论】:
-
X x11{};工作。 -
我想说 gcc 的实现现在正处于实验阶段。即
vector v{2,3}有效,但vector v{2,3,4}产生'int' is not a class, struct, or union type的错误。 -
@krzaq:它似乎试图为这种特殊情况调用constructor (2)。我想知道这是否真的是有意的(即在这些情况下消歧的规则是什么)。顺便说一句,我知道 gcc 处于实验阶段 - 我的兴趣是在适当的情况下提交错误报告。
-
@VittorioRomeo 向量填充了值 2 和 3,而不是 3 和 3。如果你用
vector v(2,3)初始化它,它会调用你提到的构造函数 -
你不喜欢“通用构造”语法吗?比上一个更令人困惑...
标签: c++ templates language-lawyer c++17 template-argument-deduction