A move constructor initializes an object from an rvalue by reusing its resources instead of copying them. For std::vector, this can transfer ownership of the element storage from a temporary vector. section 2.2.3
Generating Pascal’s triangle
triangle.push_back(get_next_row(triangle.back())) passes a temporary row to push_back. The T&& overload can move-construct the new vector, avoiding the copy required by push_back(const T&). section 2.2.3
The important rules are:
- std::move casts a named value back to an rvalue; it does not itself move anything. section 2.2.3
- After moving, the source object remains valid but has an unspecified state and is generally no longer useful. section 2.2.3

