正确使用std move为工厂类

时间:2015-02-19 11:10:00

标签: c++ c++11 move-semantics

我想创建一个像下面这样的工厂类,但我不相信这是使用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(...));
}

1 个答案:

答案 0 :(得分:7)

执行此操作的正确方法是选项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都是一种悲观,因为它会抑制移动省略。

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