通过值安全返回结构的向量?

时间:2015-02-17 12:16:59

标签: c++ stl

我读过按函数从值返回结构是完全安全的。

Is it safe to return a struct in C or C++?

如果将多个结构作为向量返回,它仍然是安全的吗?

e.g。

std::vector<mystruct> func(int c, int d){
    mystruct retval;
    retval.a = c;
    retval.b = d;

    std::vector<mystruct> structList;

    structList.push_back(retval);

    // create more structs and add them to list
    ..
    return structList;
}

为什么?是否只对原始人安全,例如数字,因为不需要分配内存?

1 个答案:

答案 0 :(得分:4)

只要mystruct类被正确编写,这是安全的,这意味着它支持复制构造和赋值和/或移动,以及使用隐含值语义进行适当的破坏。

换句话说:“返回一个向量”这件事并不困难,它确保你在任何有效状态下有一个T t1;,然后你可以说T t2(t1);和/或T t3; t3 = t1;和/或让任何T超出范围/ delete d并且不会发生任何不良或意外情况。如果您的T适用于这些情况,那么在vector<T>中使用它的一切都很好,即使是从函数返回值也是如此。

但哪种结构对此安全? mystruct可以复制/移动构造/赋值和销毁,如果它小心地只使非static数据成员成为以下类型之一,并且任何基类都做类似的事情:

  • 简单数据类型,例如intdoublebool等。

  • 具有价值语义的自我管理类型,无论您是自己编写还是由标准库或其他库提供 - 例如std::stringstd::mapstd::vectorstd::list等。这些知道如何正确复制/移动自己

  • 此类型的数组

  • std::shared_ptr您实际想要共享所有权的数据,或std::unique_ptr<>数据可以移动但不能复制

  • 引用,如果对象的副本有意义引用同一个地方

  • 其成员和基类满足上述条件的其他struct和/或class

不是原始指针 (除非某些故意共享的数据的生命周期大于对象,例如static const变量或字符串文字):for new / new[] - 对象用于管理生命周期的数据,您需要编写自己的复制构造函数和/或移动构造函数,复制赋值和/或移动赋值运算符和析构函数。使用std::shared_ptr<>std::unique_ptr<>代替通常会更容易也更好。