Is an object guaranteed to be moved when it is returned?
c++, c++11, move-semantics, return-value
Solution
Yes. See [class.copy] p32
When the criteria for elision of a copy operation are met or would be met save for the fact that the source object is a function parameter, and the object to be copied is designated by an lvalue, overload resolution to select the constructor for the copy is first performed as if the object were designated by an rvalue. If overload resolution fails, or if the type of the first parameter of the selected constructor is not an rvalue reference to the object’s type (possibly cv-qualified), overload resolution is performed again, considering the object as an lvalue. [ Note: This two-stage overload resolution must be performed regardless of whether copy elision will occur. It determines the constructor to be called if elision is not performed, and the selected constructor must be accessible even if the call is elided. — end note ]
Problem
I know that when passing an object by value to a function, the move constructor is always called if there is one, assuming no copy elision. What about returning an object by value? For example, say we have a class `Foo` which has a move constructor, and we have a function that returns a `Foo` object. ``` Foo g() { Foo f; // do something with f return f; } ``` If we assume there is no RVO, is the move constructor guaranteed to be called? Update: I guess I didn't show my intention clearly. I just want to know I can in the worst case have the object moved not copied. Either RVO or NRVO happens, I am happy. And I should also say that move constructor and move assignment are not deleted and are properly implemented.