什么是基于堆栈的引用?

Naw*_*waz 3 c++ reference constants temporary-objects

什么是基于堆栈的引用?它们与作为对象成员的引用有何不同?标准会讨论这些吗?

我在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?
}
Run Code Online (Sandbox Code Playgroud)

A1:是的。这是一个 C++ 特性……代码是有效的,并且完全符合它的功能。

通常,临时对象仅持续到它出现的完整表达式的结尾。但是,C++ 特意指定将临时对象绑定到堆栈上对 const 的引用将临时对象的生命周期延长到引用本身的生命周期,从而避免了常见的悬空引用错误。在上面的示例中, f() 返回的临时值一直存在到右花括号为止。(请注意,这仅适用于基于堆栈的引用。它不适用于作为对象成员的引用。

sbi*_*sbi 5

在给定的上下文中,基于堆栈的引用意味着引用是堆栈上的自动对象。

也就是说,在

// ...
{
  // ...
  const foo& x = some_foo;
  // ...
}
// ...
Run Code Online (Sandbox Code Playgroud)

x是一个基于堆栈的对象,而the_foo

class bar {
  // ...
  foo& the_foo;
  // ...
};
Run Code Online (Sandbox Code Playgroud)

不是。