structured_binding — 구조적 바인딩 선언
structured_binding — 구조적 바인딩 선언 (Structured binding declaration)
**구조적 바인딩 선언(structured binding declaration)**은 지정된 이름들을 이니셜라이저의 부분 객체(subobject)나 원소에 바인딩하는 선언이에요. C++17에서 도입됐어요.
참조와 마찬가지로 구조적 바인딩은 기존 객체의 별칭(alias)이에요. 참조와 달리 구조적 바인딩은 반드시 참조 타입일 필요는 없어요.
출처: cppreference
본문
문법 (Syntax)
attr decl-specifier-seq ref-qualifier [ sb-identifier-list ] initializer ;
attr— 임의 개수의 속성decl-specifier-seq— 지정자들의 시퀀스 (auto,static,constexpr(C++26)등)ref-qualifier— 선택적&또는&&sb-identifier-list— 바인딩할 이름들의 목록initializer— 초기화자
// 배열에서
int arr[3] = {1, 2, 3};
auto [a, b, c] = arr; // a=1, b=2, c=3
// 튜플/페어에서
std::pair<int, std::string> p{1, "one"};
auto [num, name] = p; // num=1, name="one"
// 구조체에서
struct Point { double x, y; };
Point pt{1.5, 2.5};
auto [px, py] = pt; // px=1.5, py=2.5
구조적 바인딩은 다음 세 가지 대상에서 사용할 수 있어요.
- 배열 — 각 원소를 순서대로 바인딩
std::tuple_size를 지원하는 타입(튜플·페어) —std::get으로 가져온 각 원소- 비정적 데이터 멤버가 모두 public인 클래스 타입 — 멤버를 선언 순서대로 바인딩
&를 붙이면 참조 바인딩을 해요.
auto& [rx, ry] = pt; // 참조 — pt를 수정할 수 있음
rx = 10.0; // pt.x가 바뀜
맵 순회를 비롯해 매우 자주 쓰여요.
std::map<std::string, int> scores;
for (const auto& [name, score] : scores) {
std::cout << name << ": " << score << '\n';
}
구조적 바인딩은 여러 값을 하나의 선언으로 깔끔하게 받아내는 현대 C++의 편리한 기능이에요. 반복문과 함수 반환 처리에서 특히 유용해요.