std::initializer_list<T> cho phép khởi tạo object bằng cú pháp {...} (brace initialization) với nhiều giá trị — đặc biệt hữu ích cho container.
cpp
class NumberSet {
std::vector<int> data_;
public:
NumberSet(std::initializer_list<int> list) : data_(list) {}
};
NumberSet s = {1, 2, 3, 4, 5}; // gọi constructor nhận initializer_list
// STL containers hỗ trợ sẵn:
std::vector<int> v = {10, 20, 30};
std::map<std::string, int> m = {{"a", 1}, {"b", 2}};Lưu ý về priority:
cpp
class Foo {
public:
Foo(int size) {} // constructor A
Foo(std::initializer_list<int> l) {} // constructor B
};
Foo f1(5); // gọi A — round-bracket: không ưu tiên initializer_list
Foo f2{5}; // gọi B — brace: ưu tiên initializer_list constructorHành vi ưu tiên initializer_list constructor khi dùng {} là nguồn gốc nhiều bug ngầm trong C++11.
std::initializer_list<T> allows initialising objects with brace syntax {...} using multiple values — especially useful for containers.
cpp
class NumberSet {
std::vector<int> data_;
public:
NumberSet(std::initializer_list<int> list) : data_(list) {}
};
NumberSet s = {1, 2, 3, 4, 5}; // calls initializer_list constructor
// STL containers support this natively:
std::vector<int> v = {10, 20, 30};
std::map<std::string, int> m = {{"a", 1}, {"b", 2}};Priority note:
cpp
class Foo {
public:
Foo(int size) {} // constructor A
Foo(std::initializer_list<int> l) {} // constructor B
};
Foo f1(5); // calls A — round brackets: no initializer_list preference
Foo f2{5}; // calls B — braces: initializer_list constructor winsThis preferential treatment of initializer_list constructors with {} is a common source of subtle bugs in C++11.