什么“它不适用于作为对象成员的引用”在GotW#88中意味着什么?

时间:2017-08-02 12:06:11

标签: c++ gotw

Herb Sutter

  

有效并发:使用锁定层次结构来避免死锁有效   并发:打破Amdahl定律! »GotW#88:“大多数人”的候选人   重要的常数“2008-01-01作者:Herb Sutter一位朋友最近问我   以下示例1是否合法,如果是,则意味着什么。它导致了一个   很好的讨论我以为我会发布在这里。因为它接近GotW   已经风格了,我以为我会在所有这些之后做另一个名誉   年...不,我还没有重新开始写作的新年决议   常规的GotWs。 : - )

     

JG问题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()直到结束大括号。 (注意这只适用于   基于堆栈的引用。 它不适用于参考   对象成员。)

最初,我认为最后一句意思是:

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;
}

然而,它显然很好用。

那么,“它对于作为对象成员的引用不起作用”是什么意思?

1 个答案:

答案 0 :(得分:5)

这意味着如果你这样做:

string f() { return "abc"; }

struct foo {
  string const & _s;
  foo() : _s(f()) {}
};

它不会延长从f返回的临时生命。参考文献_s会摇摆不定。

延长临时使用寿命是具有自动存储持续时间的引用属性。即函数范围内的局部变量。