按值返回对象的向量

时间:2016-07-09 05:48:51

标签: c++ c++11

我想知道以下是否是一种返回深vector个对象的安全方法。

class MyClass {
    //...
}

std::vector<MyClass> get_list(a,b,c) {
    // obj is created on the stack
    MyClass obj(a,b,c);
    std::vector<MyClass> objects();
    objects.push_back(obj);
    // objects[0] contains a pointer to a stack variable?
    return objects
}

特别是,返回的向量如何不包含对堆栈内存位置的引用?

3 个答案:

答案 0 :(得分:3)

是否安全取决于MyClass。但假设它是well behaved class with value semantics,那么是的,它非常安全。 std::vector按值存储其对象。当你这样做时:

objects.push_back(obj);

obj的副本放入向量中(假设您实际上有一个向量which you don't)。当你返回向量时,它是moved(虽然这个移动可以并且通常是optimized away)到调用函数。

答案 1 :(得分:2)

objects.push_back(obj);

局部变量,即obj, COPIED 进入矢量。因此,向量不会包含对局部变量的引用。

顺便说一下,你不能定义这样的矢量:

std::vector<MyClass> objects();

实际上,这是一个函数声明:一个名为objects的函数,它没有参数,并返回一个std :: vector。

相反,你应该这样做:

std::vector<MyClass> objects;

答案 2 :(得分:0)

在这种情况下,objects.push_back(obj);会调用T const&版本的std::vector::push_back 参数。