C++11
提供了
initializer_list
来接受变⻓的对象初始化列表:
class A{
public:
A(std::initializer_list<int> list);
};
A a = {1, 2, 3};
注意
初始化列表
特性只是现有语法增强,并不是提供了动态的可变参数。该列表只能静态地构造
c++11标准中,initializer_list对于标准库的编写影响非常大,说一个简单的例子,在c++11之前,max函数的源程序是这样的:
template <class T> const T& max (const T& a, const T& b);
template <class T, class Compare>
const T& max (const T& a, const T& b, Compare comp); //支持自己编写的比较函数
也就是max函数只能比较两者之间的大小,但是有了initializer_list后,c++11标准库中添加另外一种实现方式:
template <class T> T max (initializer_list<T> il);
template <class T, class Compare>
T max (initializer_list<T> il, Compare comp);
这就说明,c++11之后,max函数可以传递更多的参数,栗子:
cout << max({ 54,16,48,5 }) << endl; //输出54
c++11中统一了初始化列表(Uniform Initiaization),即均可以使用{}来对对象进行初始化。例如:
int value[]{1,2,3};
vector<int> v{2,3,4,5,6,7};
vector<string> cities{"Beijing","Dezhou"};
int i; //i has undefined value
int j{}; //j is initialized by 0
int *p; //p has undfined value
int *q{}; //q is initialized by nullptr
综上,上面的初始化列表背后就是使用initializer_list来进行实现的,比如vector和map的构造函数中新增了这样一种新的构造函数:
vector (initializer_list<value_type> il,
const allocator_type& alloc = allocator_type()); //vector使用initializer_list进行初始化
map (initializer_list<value_type> il,
const key_compare& comp = key_compare(),
const allocator_type& alloc = allocator_type()); //map使用initializer_list进行初始化
这样才支持使用初始化列表来对其进行初始化