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

陳 力*_*陳 力 1 c++ gotw

草药萨特:

有效并发:使用锁定层次结构来避免死锁有效并发:打破Amdahl定律!»想要#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?
}
Run Code Online (Sandbox Code Playgroud)

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

但是,它显然很好用.

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

Sto*_*ica 5

这意味着如果你这样做:

string f() { return "abc"; }

struct foo {
  string const & _s;
  foo() : _s(f()) {}
};
Run Code Online (Sandbox Code Playgroud)

它不会延长从中返回的临时寿命f.参考文献_s将悬挂起来.

延长临时工作的寿命是具有自动存储持续时间的参考的属性.即功能范围内的局部变量.