我想创建一个如下所示的工厂类,但是我不确定这是使用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/