DrY*_*Yap 19 c++ initializer-list c++11
我一直在研究如何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} };
Run Code Online (Sandbox Code Playgroud)
我很惊讶地发现这不起作用,编译器抱怨它找不到合适的构造函数(它想给我3个参数但是第18.9节只描述了一个默认的构造函数).
经过一番摆弄后,我发现我的班级必须完全命名std::initializer_list才能奏效.我还可以别名std::initializer_list成MyNamespace,但我不能别名MyNamespace::InitializerList为std::initializer_list.
它似乎不是真正的语言功能,因为它取决于标准库?
我的问题的要点是为什么名称如此重要以及它试图传递给构造函数的那3个参数是什么?
Nic*_*las 22
名称很重要,因为标准说它是.标准需要某种方式让你能够说,"这个构造函数可以传递一个包含类型T的序列值的braced-init-list".这种方式被命名为" std::initializer_list".
你不能创建一个具有所有语言属性的类initializer_list.您可以制作一个满足标准第18.9节规定类型的条件.但是你会注意到那里指定的唯一构造函数是默认构造函数.创建initializer_list带有实际元素的唯一方法依赖于编译器,而不是用户域代码.
所以你不能复制一切initializer_list.就像你无法复制一样std::type_info.C++标准库不是可选的.