C++新特性_列表初始化(initiallizer_list)
1、使用举例:
std::vector<int> a{1,2,3}; // 列表初始化
编译器会将大括号{}转换为std::initializer_list,编译器会调用 std::initializer_list的私有构造函数,生成vector的入参,所以vector里面有一个入参是initializer_list的的构造函数,实际上,所有的stl容器都会有这样的构造函数。
2、std::min、std_max的新功能
std::min 和std_max 也新增了入参是initiallizer_list的函数实现, 这样就不仅仅可以比较两个数了。
例如:
std::min({1,2,3,4}); // 这样就可以从多个元素中找到最小值1了
3、实现
initiallizer_list的实现大致如下:
1 template <typename T> 2 class initializer_list 3 { 4 public: 5 typedef T value_type; 6 typedef T& reference; 7 typedef const T& const_reference; 8 typedef T* iterator; 9 typedef const T* const_iterator; 10 typedef size_t size_type; 11 private: 12 // 成员结构只存了一个指针和长度,因此改对象实际上是一个浅拷贝,并没有内含数据 13 iterator m_array; 14 size_type m_len; 15 16 // 虽然这里是私有的,但是编译器可以调用 17 constexpr initializer_list(const_reference a, unsigned int l) 18 : m_array(a), m_len(l) {} 19 public: 20 // 默认构造 21 constexpr initializer_list() noexcept 22 : m_array(0), m_len(0) {} 23 24 constexpr size_type size() const noexcept 25 { 26 return m_len; 27 } 28 constexpr iterator begin() const noexcept 29 { 30 return m_array; 31 } 32 constexpr iterator end() const noexcept 33 { 34 return begin() + m_len; 35 } 36 };