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)
执行此操作的正确方法是选项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.