Return 按值安全的结构向量?

Return vector of structs by value safe?

我读到 return 从函数中按值构造结构是完全安全的。

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

如果你 return 多个结构作为一个向量是否仍然安全?

例如

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;
}

为什么?它只对原语安全吗? numbers 因为不需要分配内存?

只要正确编写 mystruct class 就是安全的,这意味着它支持复制构造和赋值 and/or 移动,以及适当的销毁,具有隐含的值语义。

换句话说:"returning a vector" 事情不是这里的难点,它是确保你是否有一个 T t1; 处于任何有效状态,然后你可以说 T t2(t1); and/or T t3; t3 = t1; and/or 让任何 T 超出范围/成为 deleted 并且不会发生任何不好或意外的事情。如果您的 T 适用于这些场景,那么在 vector<T> 中使用它都很好,即使是从函数按值返回也是如此。

但是哪些结构是安全的? mystruct 可以 copy/move construct/assign 并销毁如果小心只使非 static 数据成员成为以下类型之一,以及任何基础 classes做类似的事情:

  • 简单数据类型,如intdoublebool

  • 具有值语义的自我管理类型,无论是您自己编写的还是由标准库或其他库提供的 - 例如std::stringstd::mapstd::vectorstd::list等这些懂得copy/move自己的正确

  • 这种类型的数组

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

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

  • other structs and/or class其成员和基础classes满足上述条件

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