homer512 icon

Move return

homer512 | PRO | 12/23/16 03:34:36 PM UTC | 0 ⭐ | 600 👁️ | Never ⏰ | []
C++ |

1.07 KB

|

None

|

0 👍

/

0 👎

#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