所以我正在查看一些代码,我看到了:
class whatever
{
public:
void SomeFunc(SomeClass& outVal)
{
outVal = m_q.front();
m_q.pop();
}
private:
std::queue<SomeClass> m_q;
};
这似乎不再是outVal将是一个有效的参考...但是,它似乎工作。
我之前也在其他代码中看过这个,这个有效吗?感谢
答案 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();