基于auto的范围传递的参数

时间:2014-10-27 15:39:17

标签: c++ c++11 for-loop

vector<MyClass> objects;
for (auto obj : objects)
{}

obj会是每个对象还是参考的副本?

3 个答案:

答案 0 :(得分:10)

你写的方式会得到每个元素的副本。要获得副本,请使用

for (auto&& obj: object) {
}

您还可以使用其他一个明显的变体:

  1. 仍然使用推断类型,但要明确使用引用:auto&
  2. 明确但使用const引用:auto const&
  3. 您实际上也可以使用以下类型: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