[2026] C++ std::initializer_list | Brace Lists for Functions and Containers
이 글의 핵심
std::initializer_list (C++11) is a lightweight view over a brace-enclosed list. Used for container init and variadic-like APIs—not a full container; watch lifetime and vector ctor ambiguity.
What is std::initializer_list?
std::initializer_list{a,b,c}. It is widely used for container initialization and function parameters that want a variable number of same-type arguments.
아래 코드는 cpp를 사용한 구현 예제입니다. 필요한 모듈을 import하고, 반복문으로 데이터를 처리합니다. 각 부분의 역할을 이해하면서 코드를 살펴보시기 바랍니다.
#include <initializer_list>
#include <vector>
// 실행 예제
void print(std::initializer_list<int> list) {
for (int x : list) {
std::cout << x << " ";
}
std::cout << std::endl;
}
int main() {
print({1, 2, 3, 4, 5});
}
Why it matters:
- Variadic-like call sites without variadic templates
- Type safety for homogeneous lists
- STL integration—containers support it
Container initialization
아래 코드는 cpp를 사용한 구현 예제입니다. 코드를 직접 실행해보면서 동작을 확인해보세요.
std::vector<int> v1 = {1, 2, 3, 4, 5};
std::vector<int> v2{1, 2, 3, 4, 5};
std::map<std::string, int> m = {
{"Alice", 90},
{"Bob", 85}
};
std::set<int> s = {1, 2, 3, 4, 5};
Custom class
아래 코드는 cpp를 사용한 구현 예제입니다. 클래스를 정의하여 데이터와 기능을 캡슐화하며, 반복문으로 데이터를 처리합니다. 각 부분의 역할을 이해하면서 코드를 살펴보시기 바랍니다.
class MyVector {
std::vector<int> data;
public:
MyVector(std::initializer_list<int> list) : data(list) {}
void print() const {
for (int x : data) std::cout << x << " ";
std::cout << std::endl;
}
};
int main() {
MyVector v = {1, 2, 3, 4, 5};
v.print();
}
Examples
Sum / stats
아래 코드는 cpp를 사용한 구현 예제입니다. 반복문으로 데이터를 처리합니다. 코드를 직접 실행해보면서 동작을 확인해보세요.
int sum(std::initializer_list<int> list) {
int total = 0;
for (int x : list) total += x;
return total;
}
2D matrix helper
아래 코드는 cpp를 사용한 구현 예제입니다. 클래스를 정의하여 데이터와 기능을 캡슐화하며, 반복문으로 데이터를 처리합니다. 코드를 직접 실행해보면서 동작을 확인해보세요.
class Matrix {
std::vector<std::vector<int>> data;
public:
Matrix(std::initializer_list<std::initializer_list<int>> rows) {
for (const auto& row : rows) {
data.emplace_back(row);
}
}
};
Braces vs parentheses (vector)
아래 코드는 cpp를 사용한 구현 예제입니다. 코드를 직접 실행해보면서 동작을 확인해보세요.
std::vector<int> v1{10}; // one element: 10
std::vector<int> v2(10); // size 10
std::vector<int> v3{10, 20}; // two elements
std::vector<int> v4(10, 20); // size 10, fill 20
Narrowing
int x = 3.14; // allowed (warning)
// int y{3.14}; // error in list context
int y{static_cast<int>(3.14)};
Most Vexing Parse
Widget w{}; // object
// Widget w(); // function declaration
Implementation model (conceptual)
initializer_list holds begin pointer + size to a compiler-generated const array. Copying the initializer_list object is cheap and may alias the same storage.
Lifetime: the backing array lives until the end of the full-expression containing the list—do not return a initializer_list pointing at stale storage; return a vector (or similar) instead.
Patterns
Builder
아래 코드는 cpp를 사용한 구현 예제입니다. 클래스를 정의하여 데이터와 기능을 캡슐화하며, 반복문으로 데이터를 처리합니다. 코드를 직접 실행해보면서 동작을 확인해보세요.
class QueryBuilder {
std::vector<std::string> conditions_;
public:
QueryBuilder& where(std::initializer_list<std::string> conditions) {
for (const auto& c : conditions) conditions_.push_back(c);
return *this;
}
};
makeSet
다음은 간단한 cpp 코드 예제입니다. 코드를 직접 실행해보면서 동작을 확인해보세요.
template<typename T>
std::set<T> makeSet(std::initializer_list<T> list) {
return std::set<T>(list);
}