std::initializer_list<T> 是 C++11 引入的一个模板类型,定义在 <initializer_list> 中。
如果一个类定义了接受 std::initializer_list<T> 的构造函数,那么就可以用花括号 {...} 来初始化这个类的对象。
基本形式
cpp
class MyClass {
public:
MyClass(std::initializer_list<int> vals) {
// vals 里就是 {1, 2, 3} 这些元素
}
};
MyClass obj{1, 2, 3};
std::initializer_list 很轻量,内部通常只是一个指向元素数组的指针和长度。它不拥有元素,元素由编译器生成的临时数组保存。
cpp
#include <initializer_list>
#include <iostream>
#include <vector>
class MyArray {
public:
// initializer_list 构造函数
MyArray(std::initializer_list<int> vals) {
std::cout << "调用 initializer_list 构造: ";
for (int v : vals) {
data_.push_back(v);
std::cout << v << ' ';
}
std::cout << '\n';
}
// 普通构造函数,用来对比
MyArray(int count, int value) {
std::cout << "调用普通构造 MyArray(int, int): ";
data_.assign(count, value);
for (int v : data_) {
std::cout << v << ' ';
}
std::cout << '\n';
}
void print() const {
for (int v : data_) {
std::cout << v << ' ';
}
std::cout << '\n';
}
private:
std::vector<int> data_;
};
int main() {
MyArray a{1, 2, 3}; // 调用 initializer_list 构造
MyArray b(3, 7); // 调用普通构造:3 个 7
MyArray c{3, 7}; // 注意:花括号非空时优先调用 initializer_list 构造
// 所以 c 中是两个元素:3 和 7,而不是 3 个 7
a.print(); // 1 2 3
b.print(); // 7 7 7
c.print(); // 3 7
}