Namaran

Code daily. Without assist.

2026-08-24

lifetime.cpp

#include <iostream>

struct Loud {
    Loud() { std::cout << "born "; }
    ~Loud() { std::cout << "gone "; }
};

Loud make() { return Loud(); }

int main() {
    const Loud& r = make();
    std::cout << "using ";
    (void)r;
}

これは何を出力するでしょうか?

Answer

born using gone 。一時オブジェクトをconst参照に束縛すると、その寿命は参照自身のスコープに合わせて延長されます。そのためrのデストラクタは、生成した行の直後ではなく、mainの終わりまで呼ばれません。強制コピー省略(mandatory copy elision)により、make()が返すオブジェクトはrが束縛する場所に直接構築されるため、born/goneのペアはちょうど1組だけになります。