#include <stdio.h>
#include <stdlib.h>
#include <utility>
struct Foo
{
Foo()
{
m_Bar = new int;
*m_Bar = s_Baz++;
printf("Ctor %8p %i\n", m_Bar, *m_Bar);
}
Foo(const Foo& other)
{
m_Bar = new int;
*m_Bar = *(other.m_Bar);
printf("Copy %8p %i\n", m_Bar, *m_Bar);
}
Foo(Foo&& other)
{
m_Bar = other.m_Bar;
other.m_Bar = nullptr;
printf("Move %8p %i\n", m_Bar, *m_Bar);
}
~Foo()
{
printf("Dtor %8p\n", m_Bar);
delete m_Bar;
}
int* m_Bar;
static int s_Baz;
};
int Foo::s_Baz;
void DoFoo(Foo foo)
{
printf("Foo %8p %i\n", foo.m_Bar, *(foo.m_Bar));
}
int main()
{
Foo foo;
DoFoo(foo);
DoFoo(Foo{});
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHV0aWxpdHk+CgpzdHJ1Y3QgRm9vCnsKICAgIEZvbygpCiAgICB7CiAgICAgICAgbV9CYXIgPSBuZXcgaW50OwogICAgICAgICptX0JhciA9IHNfQmF6Kys7CiAgICAgICAgcHJpbnRmKCJDdG9yICU4cCAlaVxuIiwgbV9CYXIsICptX0Jhcik7CiAgICB9CiAgICAKICAgIEZvbyhjb25zdCBGb28mIG90aGVyKQogICAgewogICAgICAgIG1fQmFyID0gbmV3IGludDsKICAgICAgICAqbV9CYXIgPSAqKG90aGVyLm1fQmFyKTsKICAgICAgICBwcmludGYoIkNvcHkgJThwICVpXG4iLCBtX0JhciwgKm1fQmFyKTsKICAgIH0KICAgIAogICAgRm9vKEZvbyYmIG90aGVyKQogICAgewogICAgICAgIG1fQmFyID0gb3RoZXIubV9CYXI7CiAgICAgICAgb3RoZXIubV9CYXIgPSBudWxscHRyOwogICAgICAgIHByaW50ZigiTW92ZSAlOHAgJWlcbiIsIG1fQmFyLCAqbV9CYXIpOwogICAgfQogICAgCiAgICB+Rm9vKCkKICAgIHsKICAgICAgICBwcmludGYoIkR0b3IgJThwXG4iLCBtX0Jhcik7CiAgICAgICAgZGVsZXRlIG1fQmFyOwogICAgfQoKICAgIGludCogbV9CYXI7CiAgICBzdGF0aWMgaW50IHNfQmF6Owp9OwoKaW50IEZvbzo6c19CYXo7Cgp2b2lkIERvRm9vKEZvbyBmb28pCnsKICAgIHByaW50ZigiRm9vICAlOHAgJWlcbiIsIGZvby5tX0JhciwgKihmb28ubV9CYXIpKTsKfQoKaW50IG1haW4oKQp7CiAgICBGb28gZm9vOwogICAgRG9Gb28oZm9vKTsKICAgIERvRm9vKEZvb3t9KTsKICAgIHJldHVybiAwOwp9Cg==