33. 구조화된 바인딩(structured bindings)의 내부 동작

난이도 중 해설 보기 →

결함을 모두 찾고 원인·수정안·더 나은 설계를 제시하라. 마커 (A)(B) 는 주목 위치 힌트다.

결함 코드 · C++
// 주제: 구조화된 바인딩(structured bindings)의 내부 동작
//
// C++17 의 auto [a, b] = ... 는 튜플/구조체/배열을 "언팩"하는 것처럼 보이지만,
// 실제로는 숨은 객체 e 를 하나 만들고 a, b 는 그 하위 객체에 대한 "이름"이다.
// 값/참조 여부, 복사 시점, const 전파를 정확히 예측하는 문제다.
//
// 과제:
//  1) main 의 출력이 무엇이 될지 순서대로 예측하라.
//  2) `auto [x, y] = p;` 와 `auto& [x, y] = p;` 에서 x 를 수정하면 원본 p 가 어떻게
//     되는지 각각 설명하라(왜 그런지 숨은 객체 관점에서).
//  3) 구조화된 바인딩 이름이 "참조가 아님"에도 왜 참조처럼 원본을 바꿀 수 있는지
//     (배열/구조체의 경우) 내부 모델로 설명하라.
// 내부 동작 설명은 answer.md 에서 다룬다.

#include <cstdio>
#include <tuple>

struct Point { int x; int y; };

int main() {
    Point p{10, 20};

    // (1) auto& 로 받은 뒤 바인딩을 수정하면 원본 p 는?
    auto& [rx, ry] = p;
    rx = 99;
    std::printf("A p.x=%d p.y=%d\n", p.x, p.y);

    // (2) auto (값)로 받은 뒤 바인딩을 수정하면 원본 p 는?
    auto [cx, cy] = p;
    cx = -1;
    std::printf("B p.x=%d cx=%d\n", p.x, cx);

    // (3) 배열 언팩
    int arr[3] = {1, 2, 3};
    auto& [a0, a1, a2] = arr;
    a1 = 200;
    std::printf("C arr={%d,%d,%d}\n", arr[0], arr[1], arr[2]);

    // (4) tuple + tie-like
    std::tuple<int, double> t{7, 3.5};
    auto [ti, td] = t;
    std::printf("D ti=%d td=%.1f\n", ti, td);

    return 0;
}
내 리뷰 · C++
내 답안 · 자동 저장

작성 후 위 해설 보기에서 모범 해설과 대조하세요.