for(auto& pointer:vectorOfPointers)vs for(auto pointer:vectorOfPointers)

时间:2014-12-19 12:14:37

标签: c++ pointers c++11

我在想......

之间是否有任何真正的区别
for(auto &pointer : vectorOfPointers){pointer->fun();}

for(auto pointer : vectorOfPointers){pointer->fun();}

其中vectorOfPointers被声明为正常的老派指针的简单vector

std::vector<SomeType *> vectorOfPointers;

我知道&中的for(auto &o : objects)代表参考,而for(auto o : objects)是值的循环。但是&#34;价值观&#34;在我的例子中是指针本身 - 我可以访问它们指向的对象并用两个循环修改它们。

那么,有什么不同吗?如果&#34;不是真的&#34; (在使用和编译器从它们生成的内容中),这两个选项中的一个可能是常用/已批准的选项吗?

不要在讨论中添加智能指针,我对这种精确的情况很感兴趣。

2 个答案:

答案 0 :(得分:4)

  

那么,有什么不同吗?

在这个具体的例子中,没有;两个循环都做同样的事情,并且应该生成(或多或少)相同的代码。

更一般地说,非const引用允许您修改向量元素。副本没有,但(对于复杂类型)可能效率较低,并且要求类型可以复制。

  

这两个选项中的一个可能是常用的/已批准的选项吗?

我使用与函数参数相同的经验法则:仅当我想允许修改时才通过非const引用;否则,按简单类型的值或复杂或不可复制类型的const引用。

答案 1 :(得分:1)

在第一种情况下,您可以引用向量中的指针。在第二种情况下,您可以从向量中获得指针的副本。如果你要修改pointer,只有在第一种情况下,你的矢量中的指针也会被修改。

你的向量包含指针这一事实真的不仅仅是重点。无论如何,这种行为是相同的。