正确使用std move为工厂类

Mic*_*ael 4 c++ move-semantics c++11

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

选项2:

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

main()
{
   Foo f=std::move(FooFactory::createFoo(...));
}
Run Code Online (Sandbox Code Playgroud)

T.C*_*.C. 8

执行此操作的正确方法是选项3(也与之前相同):

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

int main()
{
   Foo f=FooFactory::createFoo(...);
}
Run Code Online (Sandbox Code Playgroud)

temp已被视为一个右值return temp;.没有std::move必要; 同样FooFactory::createFoo(...);已经是右值,所以你也不需要std::move.事实上,在任何一种情况下,使用std::move都是一种悲观,因为它抑制了移动省略.

你的选项1不仅低效而且不正确,因为它返回一个悬空引用temp.