什么是基于堆栈的引用?它们与作为对象成员的引用有何不同?标准是否涉及这些内容?
我在Herb Sutter撰写的一篇文章中发现了这个问题:
Q1:以下代码是否是合法的C ++?
A1: 是的。这是C++的一个特性...代码是有效的,并且确切地执行了它所看起来要做的事情。通常,临时对象只持续到它出现的完整表达式的末尾。然而,C++有意规定将临时对象绑定到栈上const引用会延长临时对象的生命周期,直到引用本身的生命周期结束,从而避免了常见的悬空引用错误。在上面的示例中,由f()返回的临时对象一直存在,直到右花括号。请注意,这仅适用于基于堆栈的引用。对于作为对象成员的引用,它不起作用。
我在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()返回的临时对象一直存在,直到右花括号。请注意,这仅适用于基于堆栈的引用。对于作为对象成员的引用,它不起作用。