为被销毁的东西分配C ++ out引用?

时间:2009-10-18 23:48:00

标签: c++ stl pass-by-reference

所以我正在查看一些代码,我看到了:

class whatever 
{
public:
    void SomeFunc(SomeClass& outVal)
    {
        outVal = m_q.front();
        m_q.pop();
    }

private:
    std::queue<SomeClass> m_q;
};

这似乎不再是outVal将是一个有效的参考...但是,它似乎工作。

我之前也在其他代码中看过这个,这个有效吗?感谢

3 个答案:

答案 0 :(得分:6)

请记住,引用不像指针:它们在创建后不能反弹。这意味着如果我这样做

int a;
int b;
int &c = a;

然后在整个范围内,对c的赋值实际上意味着对a的赋值。所以,

int a = 2;
{
   int b = 3;
   int &c = a;
   c = b;
   b = -5;
}
printf("%d",a); // prints "3".

因此,在这种情况下,引用不是指向删除的对象。而是通过赋值运算符将m_q.front()的返回值复制到任何outVal引用中。

答案 1 :(得分:2)

我在之前的回复中所写的内容完全是胡说八道。 (无论是谁支持我的原始回复,请将其取回:)

在此示例中,引用未绑定到垂死对象,而是将前面对象的值复制到另一个对象(由引用引用)。副本继续独立于队列而存在,队列前端被销毁的事实对副本没有不利影响。

请参阅Crashworks回复,以获得有关此处发生的事情的详细解释。

答案 2 :(得分:2)

这是有效的。您没有重新引用outVal引用以引用m_q.front(),这不是引用所支持的内容,而是将m_q.front()分配给变量(实际左值)outVal是指。

  SomeClass c;
  someWhatever.SomeFunc(c);

可以被认为是表现得像:

  SomeClass c;
  c = someWhatever.m_q.front();
  someWhater.m_q.pop();