initializer_list

C++11 - initializer_list

Posted by Zhgaot on July 2, 2021

文章参考:侯捷-C++11新特性

1 initializer_list的使用

1.1 函数参数可以为initializer_list

1.2 函数调用实验

【注意】下例中的赋值例子,依然调用的是构造函数,而不是赋值拷贝函数,因为这是直接创造了一个新的对象而不是旧对象的新赋值!

  1. 当类中同时包含“特定个数参数”和“initializer_list”重载时:

     class P {
     public:
     	P(int a, int b) {  // a specific number of arguments
     		cout << "P(int, int), a=" << a << ", b=" << b << endl;
     	}
     	P(initializer_list<int> initlist) {  // an initializer list
     		cout << "P(initializer_list<int>), values=";
     		for (auto i : initlist)
     			cout << i << " ";
     		cout << endl;
     	}
     };
    
     P p(77, 5);       // *P(int, int), a=77, b=5*
     P q{77, 5};       // *P(initializer_list<int>), values=77 5*
     P r{77, 5, 42};   // *P(initializer_list<int>), values=77 5 42*
     P s={77, 5};      // *P(initializer_list<int>), values=77 5*
    
  2. 当类中同时包含“特定个数参数”函数时:

     class P {
     public:
     	P(int a, int b) {  // a specific number of arguments
     		cout << "P(int, int), a=" << a << ", b=" << b << endl;
     	}
     	/*
     	P(initializer_list<int> initlist) {  // an initializer list
     		cout << "P(initializer_list<int>), values=";
     		for (auto i : initlist)
     			cout << i << " ";
     		cout << endl;
     	}
     	*/
     };
    
     P p(77, 5);       // *P(int, int), a=77, b=5*
     P q{77, 5};       // *P(int, int), a=77, b=5* (可调用)
     P r{77, 5, 42};   // ERROR
     P s={77, 5};      // *P(int, int), a=77, b=5* (可调用)
    

2 initializer_list源码

2.1 initializer_list源码

  1. initializer_list内部是一个std::array类型的指针(迭代器),意思是其内部指向了一个std::array因此initializer_list内部只有一个指针,而并没有真正包含一个array!
  2. initializer_list内部并无深拷贝的拷贝函数重载,因此它会进行浅拷贝,需注意!
  3. 编译器在看到{}时会自动创建一个std::array类型的对象,然后会将std::array类型的对象传入initializer_list的private的构造函数里,让initializer_list内部的指针_M_array_指向此array,并将内部的_M_len设定为此array的长度;

2.2 相关的std::array源码示例

3 initializer_list在std中的使用

如今所有容器都接受指定任意数量的值用于构建、赋值或insert()/assign()等;同时,max()和min()也愿意接受任意数量的参数。

关于max()和min(),它们之前只接受两个参数比较大小,现在如果使用{}的话可以接受任意数量的参数比较大小了!