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組だけになります。