struct A {
A(int) : i(new int(783)) {
std::cout << "a ctor" << std::endl;
}
A(const A& other) : i(new int(*(other.i))) {
std::cout << "a copy ctor" << std::endl;
}
~A() {
std::cout << "a dtor" << std::endl;
delete i;
}
void get() {
std::cout << *i << std::endl;
}
private:
int* i;
};
const A& foo() {
return A(32);
}
const A& foo_2() {
return 6;
}
int main()
{
A a = foo();
a.get();
}
ローカル値への参照を返すのは悪いことです。しかし一方で、const 参照は一時オブジェクトの有効期間を延長する必要があります。
このコードは UB 出力を生成します。だから延命はない。
なんで?つまり、誰かが何が起こっているのかを段階的に説明できますか?
私の推論チェーンのどこに誤りがありますか?
フー():
A(32) - 担当者
return A(32) - ローカル オブジェクトへの const 参照が作成され、返されます
A a = foo(); - a は foo() 戻り値によって初期化され、戻り値はスコープ外 (式外) になり、破棄されますが、a は既に初期化されています。
(ただし、実際にはデストラクタはコピーコンストラクタの前に呼び出されます)
foo_2():
return 6 - タイプ A の temp オブジェクトが暗黙的に作成され、このオブジェクトへの const 参照が作成され (寿命を延ばします)、返されます
A a = foo(); - a は foo() 戻り値によって初期化され、戻り値はスコープ外 (式外) になり、破棄されますが、a は既に初期化されています。
(ただし、実際にはデストラクタはコピーコンストラクタの前に呼び出されます)