C ++向量参考

C++ Reference of vector

课改{公众:向量与参考向量;refvect(int t,vector&refv=vector()):refv(refv);void运算符()(){Rev.Car();}};In main(){R(0);r();}

使用Visual Studio 2010时,这会给我一个错误:"矢量迭代器在执行时不兼容",但我不理解原因(但我可以在refv中插入元素,而不会有任何问题)。临时对象vector()的寿命与引用一样长,不是吗?


一旦声明

1
Refvect r(0);

执行(控制传递到分号之外)临时vector &refv = vector()将被销毁。现在,存储在类对象中的引用悬空-未绑定到任何活动对象。试图通过此类引用访问对象是未定义的行为。


The temporary object vector() lives as
long as the reference, no?

不!

临时性在最外层的封闭表达式(即嵌入语句而不是另一个表达式中的表达式)的末尾进行破坏。没有对引用的神奇跟踪,以确保对象的寿命与对它们的引用一样长——这将是垃圾收集。

更新:

回应您的评论:

if I use const vector &refv; it
works

我不知道怎么可能。如果将const添加到参数refv中,则它不再与成员兼容,因此不应编译。如果您还将成员更改为const,那么您将发现您不能对其调用clear,因为它不是const成员函数。

如果你在C++中找到了一些"似乎有用"的东西,那么你就完全错了用C++了!

在特定的特殊情况下,C++中有很多方法让"看起来有效",但是如果这些情况被改变了,它会更明显地失败。这被称为"未定义行为"——结果有时可能包括明显的正确行为。

最常见的形式是,即使仍然有访问数据的方法,数据仍然无效,这就是您在这里所处的情况。

正确使用C++的方法是彻底理解定义行为的局限性,尽可能地保持在其中。特别是,您需要了解对象的寿命,这样您就可以确保对对象的引用不会比它们所引用的对象寿命长。