#include <iostream>
#include <utility>
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);
}
Comments