10

As per my understanding, the move constructor will be called when there is a temporary object created. Here the getA() function is returning a temporary object but my program is not printing the message from the move constructor:

#include <iostream> using namespace std; class A { public: A() { cout<<"Hi from default\n"; } A(A && obj) { cout<<"Hi from move\n"; } }; A getA() { A obj; cout<<"from getA\n"; return obj; } int main() { A b(getA()); return 0; } 
1
  • I was searching with move constructor and google is not leading me to that page Commented Jul 7, 2016 at 14:56

1 Answer 1

9

The compiler is allowed to optimise out the instance obj and send the object directly back to the caller without a conceptual value copy being taken.

This is called named return value optimisation (NRVO). It's a more aggressive optimisation than classical return value optimisation (RVO) that a compiler can invoke to obviate the value copy of an anonymous temporary.

For the avoidance of doubt the compiler can do this even if there is a side-effect in doing so (in your case the lack of console output).

Sign up to request clarification or add additional context in comments.

3 Comments

What was wrong with the dupe target?
It was more to do with RVO not (the more recent) NRVO. IMHO a duplicate is only a good one if it's pretty exact.
Half of the answers talked about and example NRVO.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.