我一直在研究initializer_list
的实现方式,于是我找到了标准的18.9节,并找到了一个看起来足够简单的接口。我认为制作自己的版本并将其命名为MyNamespace::InitializerList
并提供一个使用案例将是很有启发性的:
template<class T>
class ArrayPrinter
{
public:
ArrayPrinter(MyNamespace::InitializerList<T> list)
{
for (auto i : list) cout << i << endl;
}
};
...
ArrayPrinter ap{ {1,2,3} };
我惊讶地发现这并不起作用,编译器抱怨它找不到合适的构造函数(它想给我3个参数,但第18.9节只描述了一个默认构造函数)。
经过一番尝试,我发现我的类必须被命名为std :: initializer_list
才能工作。我也可以将std :: initializer_list
别名为MyNamespace
,但我无法将MyNamespace :: InitializerList
别名为std :: initializer_list
。
看起来这不是真正的语言特性,因为它依赖于标准库?
我的问题的主要点是为什么名称如此重要,那些3个参数是尝试传递给构造函数的?
ArrayPrinter<int> ap{ {1,2,3} };
中添加了缺失的模板参数后,它按预期工作:实时示例。 - dypstd::initializer_list
。出现的{1,2,3}
(是一个花括号初始化列表)用于通过调用模板构造函数来构造MyNamespace::InitializerList<int>
,就像在ArrayPrinter<int> ap( MyNamespace::InitializerList<int>(1,2,3) );
中一样。 - dyp