The second copy constructor call is removed by the compiler, this is a form of copy elision: http://en.cppreference.com/w/cpp/language/copy_elision , this case falls under the second bullet point "When a nameless temporary, not bound to any references, would be moved or copied into an object of the same cv-unqualified type". The function trol() returns such a nameless temporary.