vector<MyClass> objects;
for (auto obj : objects)
{}
obj
会是每个对象还是参考的副本?
答案 0 :(得分:10)
你写的方式会得到每个元素的副本。要获得副本,请使用
for (auto&& obj: object) {
}
您还可以使用其他一个明显的变体:
auto&
。const
引用:auto const&
。MyClass&
或MyClass const&
。答案 1 :(得分:4)
是的,您将获得每个元素的副本,而不是auto&
或auto&&
。这is better understood with an example
struct MyClass {
MyClass() {}
MyClass(const MyClass&) {
cout << "copy ctor invoked" << endl;
}
};
int main(){
vector<MyClass> objects;
MyClass obj1;
objects.push_back(obj1); // Vector filling
cout << "------" << endl;
for (auto obj : objects) // Auto loop
{}
cout << "------" << endl;
for (auto& obj : objects)
{}
}
输出:
copy ctor invoked // Vector filling
------
copy ctor invoked // Auto loop
------
答案 2 :(得分:1)
简单的答案是:你的直觉是正确的,你得到一份副本。
背后的原因在于auto
推导出的类型。 Scott Mayers最近在CppCon 2014上就这一主题发表了演讲:https://www.youtube.com/watch?v=wQxj20X-tIU