我想创建一个如下所示的工厂类,但是我不确定这是使用std::move的正确方法。我不想使用太多shared_ptrs,因为在另一个shared_ptr中的shared_ptr确实很丑陋,有时会令人困惑...

选项1:

class Foo
{
  public:
  Foo(Foo&& f){...}
}

class FooFactory
{
   public:
     static Foo&& createFoo(...)
     {
       Foo temp(...);
       return std::move(temp);
     }
}

main()
{
   Foo f=FooFactory::createFoo(...);
}

选项2:
class FooFactory
{
   public:
     static Foo createFoo(...)
     {
       Foo temp(...);
       return temp;
     }// rely on compiler for optimization
}

main()
{
   Foo f=std::move(FooFactory::createFoo(...));
}

最佳答案

正确的方法是选项3(与之前相同):

class FooFactory
{
   public:
     static Foo createFoo(...)
     {
       Foo temp(...);
       return temp;
     }
};

int main()
{
   Foo f=FooFactory::createFoo(...);
}

temp is already treated as an rvalue in return temp; 。不需要std::move;同样,FooFactory::createFoo(...);已经是一个右值,因此您也不需要std::move。实际上,无论哪种情况,使用std::move都是一个悲观的说法,因为它禁止 move 省略。

您的选项1不仅效率低下,而且不正确,因为它返回了对temp的悬挂引用。

关于c++ - 正确使用std move作为工厂类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28604816/

10-13 09:06