http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58487
Bug ID: 58487 Summary: Missed return value optimization Product: gcc Version: 4.8.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: jm at bourguet dot org $ cat rva.cpp #include <iostream> class rva { public: rva() { std::cout << "Default construction\n"; } rva(rva const&) { std::cout << "Copy construction\n"; } rva& operator=(rva const&) { std::cout << "Assignation\n"; } ~rva() { std::cout << "Destruction\n"; } }; rva f(int i) { if (i == 0) { rva result; return result; } else { return rva(); } } int main() { { std::cout << "f(0)\n"; f(0); } { std::cout << "\nf(1)\n"; f(1); } { std::cout << "\ng(0)\n"; g(0); } { std::cout << "\ng(1)\n"; g(1); } return 0; } $ g++-4.8.1 --version g++-4.8.1 (GCC) 4.8.1 Copyright (C) 2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. $ g++-4.8.1 rva.cpp $ ./a.out f(0) Default construction Copy construction Destruction Destruction f(1) Default construction Destruction It seems to me that for f(0) the copy construction could be avoided.