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

구조적 바인딩은 다음 세 가지 대상에서 사용할 수 있어요.

  1. 배열 — 각 원소를 순서대로 바인딩
  2. std::tuple_size를 지원하는 타입(튜플·페어) — std::get으로 가져온 각 원소
  3. 비정적 데이터 멤버가 모두 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++의 편리한 기능이에요. 반복문과 함수 반환 처리에서 특히 유용해요.

더 알아보기 (Learn more)

cppreference