草本萨特:
有效并发:使用锁层次结构避免死锁有效并发:打破阿姆达尔定律!» GotW #88: A Candidate for the “Most Important const” 2008-01-01 作者 Herb Sutter 一位朋友最近问我下面的示例 1 是否合法,如果是,这意味着什么。它引发了一个很好的讨论,我想我会在这里发布。因为它已经接近 GotW 风格,所以我想我会在这么多年之后再做一个荣誉的……不,我还没有做出新年的决心来继续写普通的 GotW。:-)
JG Questions 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() 返回的临时值一直存在到右花括号为止。(请注意,这仅适用于基于堆栈的引用。它不适用于作为 objects 成员的引用。)
原来,我认为最后一句话的意思是:
class A
{
public:
int x;
A(const int& x_)
{
x = x_;
}
};
int main()
{
A a(1); // assign lvalue to const int&
std::cout << a.x;
}
但是,它显然工作正常。
那么,“它对对象成员的引用不起作用”是什么意思?