如何移动焦油含量 在C++中,我可以做< /P> class A { public: A(std::vector<std::unique_ptr<int>> v) : _v(std::move(v)) {} private: std::vector<std::unique_ptr<int>> _v; }

如何移动焦油含量 在C++中,我可以做< /P> class A { public: A(std::vector<std::unique_ptr<int>> v) : _v(std::move(v)) {} private: std::vector<std::unique_ptr<int>> _v; },c++,unreal-engine4,C++,Unreal Engine4,TArray有一个移动构造函数(即签名为TArray(TArray&&other)的构造函数) 因此,std::move应该以与std::vector相同的方式在TArray上工作,以完成: C++标准->UE4等效标准: std::vector->TArray std::unique_ptr->TUniquePtr std::make_unique->MakeUnique std::move->movetempiffailable(使用MoveTemp获取右值和常量的编译时检查) 因此,上

TArray
有一个移动构造函数(即签名为
TArray(TArray&&other)
的构造函数)

因此,
std::move
应该以与
std::vector
相同的方式在
TArray
上工作,以完成:

C++标准->UE4等效标准:

  • std::vector
    ->
    TArray
  • std::unique_ptr
    ->
    TUniquePtr
  • std::make_unique
    ->
    MakeUnique
  • std::move
    ->
    movetempiffailable
    (使用
    MoveTemp
    获取右值和常量的编译时检查)
因此,上面带有本机UE4类的代码示例如下所示

class MyObj {};
class A {
 public:
  A(TArray<TUniquePtr<MyObj>> v) : _v(MoveTemp(v)) {}
  auto GetV() { return _v[0].Get(); }

 private:
  TArray<TUniquePtr<MyObj>> _v;
};

int main() {
  auto o = MyObj{};
  auto v = TArray<TUniquePtr<MyObj>>();
  v.Add(MakeUnique<MyObj>(o));
  A a(MoveTemp(v));
  assert(a.GetV());
}
类MyObj{};
甲级{
公众:
A(TArray v):_v(MoveTemp(v)){}
auto GetV(){return_v[0].Get();}
私人:
柏油树;
};
int main(){
自动o=MyObj{};
自动v=TArray();
v、 添加(MakeUnique(o));
A(移动温度(v));
断言(a.GetV());
}

TUniquePtr
还有一个移动构造函数:
TUniquePtr(TUniquePtr&&Other)
通过这样做!你遇到什么问题了吗?你应该解释一下问题所在。@LightnessRacesinOrbit的问题是,ue4建议使用它的类而不是std(尽管std编译并在大多数使用ue4的平台上运行),我不清楚它是否和哪些类可以替代问题中提到的std类。你试过了吗?你有什么错误吗?是不是发生了一些你预料不到的事情?@LightnessRacesinOrbit不,它与
std
配合得很好。但坚持同样重要,因为单个开发人员无法监督整个程序的影响(在我的机器上工作不是一个好的理由)-如果您想进行更多讨论,请在聊天时打电话给我。我要求你通过实际告诉我们使用虚幻类型和移动语义的问题来提出你的主题问题。如果你做不到这一点,这是离题的,可能会被关闭!
class MyObj {};
class A {
 public:
  A(TArray<TUniquePtr<MyObj>> v) : _v(MoveTemp(v)) {}
  auto GetV() { return _v[0].Get(); }

 private:
  TArray<TUniquePtr<MyObj>> _v;
};

int main() {
  auto o = MyObj{};
  auto v = TArray<TUniquePtr<MyObj>>();
  v.Add(MakeUnique<MyObj>(o));
  A a(MoveTemp(v));
  assert(a.GetV());
}