How to avoid the copy when I return
c++, c++11, rvalue-reference
Solution
Modem C++ compiler will implement: given a type `T`:
- If T has an accessible copy or move constructor, the compiler may choose to elide the copy. This is the so-called (named) return value optimization (RVO), which was specified even before C++11 and is supported by most compilers.
- Otherwise, if T has a move constructor, T is moved(Since C++11).
- Otherwise, if T has a copy constructor, T is copied.
- Otherwise, a compile-time error is emitted.
Problem
I have a function which returns a vector or set: ``` set<int> foo() { set<int> bar; // create and massage bar return bar; } set<int> afoo = foo(); ``` In this case, I create a temporary memory space in function foo(), and then assign it to `afoo` by copying. I really want to avoid this copy, any easy way I can do this in C++11? I think this has to do with the rvalue thing. OK, update to the question: If I am going to return an object defined by myself, not the vector or set thing, does that mean I should define a move constructor? like this: ``` class value_to_return { value_to_return (value_to_return && other) { // how to write it here? I think std::move is supposed to be used? } } ``` THanks!!!