スタックベースの参照とは? オブジェクトのメンバーである参照とどう違うのですか? 規格はこれらについて話していますか?
Herb Sutter によって書かれた記事でこれに出くわしました。
Q1: 次のコードは合法的な C++ ですか?
// Example 1
string f() { return "abc"; }
void g() {
const string& s = f();
cout << s << endl; // can we still use the "temporary" object?
}
A1: はい。これは C++ の機能です。コードは有効であり、表示どおりに動作します。
通常、一時オブジェクトは、それが現れる完全な式の終わりまでしか存続しません。ただし、C++ では、一時オブジェクトをスタック上の const への参照にバインドすると、一時オブジェクトの有効期間が参照自体の有効期間まで長くなるため、一般的なダングリング参照エラーを回避できるように意図的に指定されています。上記の例では、 f() によって返されたテンポラリは、右中括弧まで存続します。(これはスタックベースの参照にのみ適用されることに注意してください。オブジェクトのメンバーである参照には機能しません。 )