30. 임시 객체의 수명과 참조 수명 연장(lifetime extension)
난이도 상 해설 보기 →
결함을 모두 찾고 원인·수정안·더 나은 설계를 제시하라. 마커
(A)(B) 는 주목 위치 힌트다.
결함 코드 · C++
// 주제: 임시 객체의 수명과 참조 수명 연장(lifetime extension)
//
// 과제:
// 1) 아래 프로그램의 출력을 순서까지 정확히 예측하라(ctor/dtor 로그 포함).
// 2) const 참조와 rvalue 참조에 임시를 바인딩하면 수명이 어떻게 연장되는지,
// 연장이 "언제까지"인지 설명하라.
// 3) 함수를 거쳐 참조를 반환하면(아래 identity 주석) 왜 수명 연장이 적용되지 않아
// dangling 이 되는지, string_view/span 같은 뷰 타입에서 같은 함정이 어떻게
// 나타나는지 설명하라. (내부 동작 설명은 answer.md 에)
#include <iostream>
#include <string>
#include <string_view>
struct Tracer {
int id;
explicit Tracer(int i) : id(i) { std::cout << "ctor " << id << "\n"; }
~Tracer() { std::cout << "dtor " << id << "\n"; }
};
Tracer make(int i) { return Tracer(i); }
int main() {
std::cout << "A\n";
const Tracer& r = make(1); // 임시를 const& 에 바인딩
std::cout << "B " << r.id << "\n";
{
Tracer&& s = make(2); // 임시를 rvalue& 에 바인딩(블록 스코프)
std::cout << "C " << s.id << "\n";
}
std::cout << "D\n";
std::cout << "E " << make(3).id << "\n"; // 참조에 바인딩하지 않은 임시
std::string_view sv = std::string("hello world").substr(0, 5); // 이 뷰의 수명에 주의
std::cout << "F built\n";
std::cout << "G\n";
return 0;
// r 의 수명에 주의
} 내 리뷰 · C++
내 답안 · 자동 저장
작성 후 위 해설 보기에서 모범 해설과 대조하세요.