proper use of std move for a factory class
c++, c++11, move-semantics
Solution
The correct way to do this is option 3 (aka same as before):
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;`. No `std::move` is necessary; similarly `FooFactory::createFoo(...);` is already an rvalue, so you don't need `std::move` either. In fact, in either case, using `std::move` is a pessimization because it inhibits move elision.
Your option 1 is not only inefficient but incorrect, as it returns a dangling reference to `temp`.
Problem
I want to create a factory class like below, but I am not confident this is the right way to use std::move. I don't want to use too many shared_ptrs, since shared_ptr inside another shared_ptr is really ugly and sometimes confusing... Option 1: ``` class Foo { public: Foo(Foo&& f){...} } class FooFactory { public: static Foo&& createFoo(...) { Foo temp(...); return std::move(temp); } } main() { Foo f=FooFactory::createFoo(...); } ``` Option 2: ``` class FooFactory { public: static Foo createFoo(...) { Foo temp(...); return temp; }// rely on compiler for optimization } main() { Foo f=std::move(FooFactory::createFoo(...)); } ```