2017-08-12 7 views
3

私の知る限りでは、次のコードで参照ro1の寿命は、スコープの終わりまで(機能g())を拡張さ:参照を返すことで寿命も延長されますか?

class Some { 
    // Implementation here 
}; 
Some f() { 
    return Some(/* constructor parameters here*/); 
} 
void g() { 
    Some&& ro1 = f(); 
    // ro1 lives till the end of this function 
} 

どのようにこの参照を返すでしょうか?オブジェクトはまだg1()に住んでいますか?それとも、h()の出口で破壊されますか?

Some&& h() { 
    Some&& ro1 = f(); 
    // Code skipped here 
    return std::forward<Some>(ro1); 
} 

void g1() { 
    Some&& ro2 = h(); 
    // Is ro2 still refering to a valid object? 
} 
+0

2番目のスニペットの生存延長はありません。 – Jarod42

+1

** **それが 'std :: forward 'だった場合、移動の構築が期待できます。しかし、あなたの2番目のスニペットでは、**以降** 'std :: forward 'なので、建設を避けてダングリングレファレンスを残します。 –

+0

'g'がローカルテンポラリを破棄して返します。ダングリングリファレンス。また、私は参照拡張は、ref値ではなく、const refのためだけだと思った - 私は何かが欠けている、C + + 1zでこの変更をしましたか? –

答えて

5

どのようにこの参照を返すでしょうか?オブジェクトはまだ生きていますか?g1()

いいえ生涯の延長は一度だけ起こります。 f()から戻された一時的なものは、参照番号ro1にバインドされ、その有効期間はその参照の存続期間にわたって延長されます。 ro1の寿命はh()の終わりで終了するので、にro2を使用すると、不明な点があります。

これが機能するためには、あなたが値に対処する必要があります:RVOはまだここに適用され

Some h() { 
    Some ro1 = f(); 
    // Code skipped here 
    return ro1; 
} 

注意。

関連する問題