为什么模板化构造函数没有推导出initializer_list?
原因是{1,2,3,4,5,6,7,8,9}
只是一个没有类型的同步结构。因此,编译器无法推导出类型T
对于这个同步构造,第一个构造函数失败了。
然而,根据特殊的标准规则std::initializer_list<T>
(除其他外)可以从这个合法构造中构造出来,并且T
可以推导出int
。因此第二个构造函数起作用了。
与函数模板参数类型推导相比,
auto x = {1,2,3,4,5,6,7,8,9};
编译器将 x 的类型设置为std::initializer_list<int>
。还有特殊的标准规则表明必须如此。严格来说这是not类型推导,因为如上所述,{1,2,3,4,5,6,7,8,9}
没有要推断的类型。 (这里发生的唯一类型推导是T = int
in std::initializer_list<T>
。)这里编译器选择(它不会推断)类型x
to be std::initializer_list<int>
。无论如何,滥用语言说这种类型并没有什么害处。x
推导为std::initializer_list<int>
.
最后,正如 DyP 在评论中所说,您可能想要的是从基容器类继承所有构造函数(而不仅仅是那些采用一个参数的构造函数)。您可以通过删除当前拥有的所有构造函数并将此行添加到test
:
using container_type::container_type;