#include <cstdio>
using namespace std;
struct Foo {
int a;
Foo(const Foo& foo) : a(foo.a + 1) {
printf("Foo(Foo& foo) a == %d\n", a);
}
Foo(int x) : a(x) {
printf("Foo(int) a == %d\n", a);
}
~Foo() {
printf("~Foo() a == %d\n", a);
a = 0;
}
};
auto fooRef(const Foo& f) {
return f;
}
int main() {
const Foo& ref = fooRef(Foo(2));
printf("ref.a == %d\n", ref.a);
printf("end of main\n");
return 0;
}
I2luY2x1ZGUgPGNzdGRpbz4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBGb28gewogICAgaW50IGE7CiAgICBGb28oY29uc3QgRm9vJiBmb28pIDogYShmb28uYSArIDEpIHsKICAgIAlwcmludGYoIkZvbyhGb28mIGZvbykgYSA9PSAlZFxuIiwgYSk7CiAgICB9CiAgICBGb28oaW50IHgpIDogYSh4KSB7CiAgICAJcHJpbnRmKCJGb28oaW50KSBhID09ICVkXG4iLCBhKTsKICAgIH0KICAgIH5Gb28oKSB7CiAgICAJcHJpbnRmKCJ+Rm9vKCkgYSA9PSAlZFxuIiwgYSk7CiAgICAJYSA9IDA7CiAgICB9Cn07CgphdXRvIGZvb1JlZihjb25zdCBGb28mIGYpIHsKICAgIHJldHVybiBmOwp9CgppbnQgbWFpbigpIHsKICAgIGNvbnN0IEZvbyYgcmVmID0gZm9vUmVmKEZvbygyKSk7CiAgICBwcmludGYoInJlZi5hID09ICVkXG4iLCByZWYuYSk7CiAgICBwcmludGYoImVuZCBvZiBtYWluXG4iKTsKICAgIHJldHVybiAwOwp9