我从头文件中复制了代码initializer_list并将类名重命名为my_initializer_list
template<class _E>
class my_initializer_list
{
public:
typedef _E value_type;
typedef const _E& reference;
typedef const _E& const_reference;
typedef size_t size_type;
typedef const _E* iterator;
typedef const _E* const_iterator;
private:
iterator _M_array;
size_type _M_len;
// The compiler can call a private constructor.
constexpr my_initializer_list(const_iterator __a, size_type __l)
: _M_array(__a), _M_len(__l) { }
public:
constexpr my_initializer_list() noexcept
: _M_array(0), _M_len(0) { }
// Number of elements.
constexpr size_type
size() const noexcept { return _M_len; }
// First element.
constexpr const_iterator
begin() const noexcept { return _M_array; }
// One past the last element.
constexpr const_iterator
end() const noexcept { return begin() + size(); }
};
Run Code Online (Sandbox Code Playgroud)
和代码:
int main()
{
my_initializer_list<int> foo = {1,2,3};
return 0;
}
Run Code Online (Sandbox Code Playgroud)
并得到错误:
could not convert '{1, 2, 3}' from '<brace-enclosed initializer list>' to 'my_initializer_list<int>'
Run Code Online (Sandbox Code Playgroud)
我的问题:STL如何实现initializer_list类?
它适用于std::initializer_list因为即使std::initializer_list是一个类,它也不是常规类.这是一个非常非常特殊的阶层,在这个意义上,当你写auto x = {1,2,3};的编译器会推断 x是std::initializer_list<int>和相应的初始化.编译器在这里进行黑魔法以执行类型推断和初始化.这是不是唯一的存储库的功能.它也是一个核心功能.
如果您打算使用my_initializer_list,那么它的构造函数需要接受,std::initializer_list以便编译器可以为您做黑魔术.
请注意,这{1,2,3}是一种无类型的表达 - 好吧,要迂腐,它甚至不是表达 ; 仅在某些特殊情况下,它可以用于使用一些特殊规则初始化对象.例如,看到这个:
auto items = {1,2,3}; //OK: items is inferred to be std::initializer_list<int>
//must #include <initializer_list>
Run Code Online (Sandbox Code Playgroud)
但是,在模板的情况下,规则是不同的:
template<typename T>
void f(T const & items);
f({1,2,3}); //ILL-FORMED: T cannot be deduced to be
//std::initializer_list<int> or anything else
//even if you use #include <initializer_list>
f(std::initializer_list<int>{1,2,3}); //OK: #include <initializer_list>
f(std::vector<int>{1,2,3}); //OK: #include <vector>
//because std::vector accepts std::initializer_list<T>
Run Code Online (Sandbox Code Playgroud)
希望有所帮助.