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++
내 답안 · 자동 저장

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