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 };

 

posted @ 2021-01-25 13:13  ho966  阅读(588)  评论(0编辑  收藏  举报