#include #include class Foo { int v; public: explicit Foo(int c) noexcept; Foo(const Foo&) noexcept; Foo(Foo&&) noexcept; ~Foo(); }; Foo mutable_return(int c) { Foo a(c), b(c + 1); return c > 0 ? a : b; } Foo const_return(int c) { const Foo a(c), b(c + 1); return c > 0 ? a : b; } Foo explicit_const_return(int c) { const Foo a(c), b(c + 1); return std::move(c > 0 ? a : b); } Foo explicit_mutable_return(int c) { Foo a(c), b(c + 1); return std::move(c > 0 ? a : b); } Foo::Foo(int c) noexcept : v(c) { std::cout << "Foo(int)\n"; } Foo::Foo(const Foo& o) noexcept : v(o.v) { std::cout << "Foo(const Foo&)\n"; } Foo::Foo(Foo&& o) noexcept : v(o.v) { std::cout << "Foo(Foo&&)\n"; } Foo::~Foo() { std::cout << "~Foo()\n"; } int main() { std::cout << "Mutable\n"; mutable_return(0); std::cout << "\nConst\n"; const_return(0); std::cout << "\nExplicit Mutable\n"; explicit_mutable_return(0); std::cout << "\nExplicit Const\n"; explicit_const_return(0); }