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()的寿命与引用一样长,不是吗?
- 注意,将临时引用绑定到非常量引用的能力是一个vs扩展,标准只允许将临时引用绑定到常量引用。
- @avakar——它仅在"请求时"提供向后兼容性大约12年。默认值是符合标准。
- @丹尼尔·厄尔威克,我不知道你所说的"应要求"是什么意思。我刚刚在VS10中创建了一个新的空项目,并且可以将临时引用绑定到非常量引用,而无需请求任何内容。实际上,Visual Studio的行为与之相反——如果需要,您必须请求标准行为(/za)。
- 我真不敢相信…怎么还这样?我在第6节的时候就有了这样的印象,那就是它已经被修复了(我以为他们必须修复很多自己的库代码,当时他们对此感到自豪)。
一旦声明
执行(控制传递到分号之外)临时vector &refv = vector()将被销毁。现在,存储在类对象中的引用悬空-未绑定到任何活动对象。试图通过此类引用访问对象是未定义的行为。
- +1.一个应该讲述当前的向量,敦促一个向量。
- @Billy-No.One should store a copy of the actual vector instead of a reference to the original most of the time.
- @Noah Roberts:Thanks for catching my typo.Please replace"copy"with"reference"
- 如果它是如此,@比利,它将是如此之多的一个字母Storing a reference appears to be the entire purpose of the class.The only change necessary seems to be to remove the possibility of a default argument.In other words,when you want a vector reference,you need to provide your own vector;the reference class can't provide one of its own-a t least not through a default parameter.
- @Rob Kennedy:I assumed that the class was an example;not real code.如果这是为了讲述这些参考文献,那么政治事务部就应该讲述这一参考文献,而不是一个典型的纯粹的参考文献。
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++的方法是彻底理解定义行为的局限性,尽可能地保持在其中。特别是,您需要了解对象的寿命,这样您就可以确保对对象的引用不会比它们所引用的对象寿命长。
- OK,thank you,but now if I use const vector;refv;it works?