53. 범위 기반 for 루프의 임시 객체 수명 함정 (dangling)
난이도 상 해설 보기 →
결함을 모두 찾고 원인·수정안·더 나은 설계를 제시하라. 마커
(A)(B) 는 주목 위치 힌트다.
결함 코드 · C++
// 주제: 범위 기반 for 루프의 임시 객체 수명 함정 (dangling reference)
//
// 과제:
// 1) 범위 기반 for 루프가 컴파일러에 의해 어떤 코드로 "탈설탕(desugar)"되는지
// (begin/end, 숨은 __range 참조) 설명하라.
// 2) 아래 loopA / loopB 중 하나는 정의되지 않은 동작(댕글링)을 일으키고 다른
// 하나는 안전하다. 어느 쪽이 위험한지, 그 이유를 임시 객체 수명 규칙
// (C++17/20 기준)으로 설명하라.
// 3) C++23 에서 이 함정이 어떻게 완화되었는지, 그리고 지금 당장 안전하게
// 고치는 방법을 제시하라.
#include <string>
#include <vector>
#include <cstdio>
struct Packet {
std::vector<int> payload_{10, 20, 30};
const std::vector<int>& payload() const { return payload_; }
};
Packet MakePacket() { return Packet{}; } // prvalue 임시 반환
void loopA() {
printf("loopA: ");
for (int x : MakePacket().payload_) printf("%d ", x);
printf("\n");
}
void loopB() {
printf("loopB: ");
for (int x : MakePacket().payload()) printf("%d ", x);
printf("\n");
}
int main() { loopA(); loopB(); return 0; } 내 리뷰 · C++
내 답안 · 자동 저장
작성 후 위 해설 보기에서 모범 해설과 대조하세요.