1

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

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

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

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

我以前也在其他代码中看到过,这有效吗?谢谢

4

3 回答 3

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 引用中。

于 2009-10-18T23:54:26.407 回答
2

我在之前的回复中写的完全是胡说八道。(谁赞成我的原始回复,请收回:)

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

请参阅 Crashworks 回复,以获得对这里发生的事情的详细解释。

于 2009-10-18T23:52:03.663 回答
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();
于 2009-10-18T23:55:00.267 回答