在标准和C++程序设计语言中,
但在编译器实现
std::initializer_list
的建议实现是简单的。这里的“简单”指的是没有什么奇怪的东西。但在编译器实现
std::initializer_list
时会变得复杂,例如,GCC拥有一个私有构造函数用于std::initializer_list
,并在其上方有一条注释,其中说:'编译器可以调用私有构造函数。'。
在这里,eerorika回答说:std::initializer_list
是特殊的。因此,我查找了编译器源代码中的相关信息:
Clang:
GCC:
我不明白为什么我们需要有一个特殊的私有构造函数?我之前遇到过这个问题,当时我想把std::vector<T>
转换成std::initializer_list<T>
。
std::initializer_list
。你真的应该只通过复制一个列表或者隐式从{list, of, values, ...}
创建一个std::initializer_list
。如果一个类型可以从std::initializer_list
构造,它也应该有一个接受迭代器范围的构造函数,以便从任何值的“列表”中构造。 - NathanOliverstd::initializer_list
用于模拟{ an, intializer, list, ...}
。它由编译器为我们创建的临时数组支持,然后在销毁std::initializer_list
对象时负责销毁该数组。如果您可以访问initializer_list(const_iterator __a, size_type __l)
构造函数,则可以使其指向不是初始化列表的内容,并且内存不受编译器控制。 - NathanOliverstd::initializer_list
是初始化列表的具体化,它不应该存在于其他情况下。特别是你不应该从代码中构造一个来统一两个用例。 - Sneftel