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