我在想...... :
之间是否有任何真正的区别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; (在使用和编译器从它们生成的内容中),这两个选项中的一个可能是常用/已批准的选项吗?
不要在讨论中添加智能指针,我对这种精确的情况很感兴趣。
答案 0 :(得分:4)
那么,有什么不同吗?
在这个具体的例子中,没有;两个循环都做同样的事情,并且应该生成(或多或少)相同的代码。
更一般地说,非const引用允许您修改向量元素。副本没有,但(对于复杂类型)可能效率较低,并且要求类型可以复制。
这两个选项中的一个可能是常用的/已批准的选项吗?
我使用与函数参数相同的经验法则:仅当我想允许修改时才通过非const引用;否则,按简单类型的值或复杂或不可复制类型的const引用。
答案 1 :(得分:1)
在第一种情况下,您可以引用向量中的指针。在第二种情况下,您可以从向量中获得指针的副本。如果你要修改pointer
,只有在第一种情况下,你的矢量中的指针也会被修改。
你的向量包含指针这一事实真的不仅仅是重点。无论如何,这种行为是相同的。