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++
내 답안 · 자동 저장
작성 후 위 해설 보기에서 모범 해설과 대조하세요.