#include <iostream>
#include <cassert>
#include <memory>
#include <string>
using namespace std;
class Thing {
string name;
public:
Thing(): name() {
// nop
}
void setName(const string name) {
this->name = name;
}
const string getName() {
return this->name;
}
};
void Foo(shared_ptr<Thing> & one, shared_ptr<Thing> two)
{
one->setName("foo");
one = two;
}
void Test(string result)
{
shared_ptr<Thing> one(new Thing());
shared_ptr<Thing> two(new Thing());
Foo(one, two);
assert(one->getName() == result);
}
int main() {
Test("foo");
Test("bar");
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y2Fzc2VydD4KI2luY2x1ZGUgPG1lbW9yeT4KI2luY2x1ZGUgPHN0cmluZz4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpjbGFzcyBUaGluZyB7CglzdHJpbmcgbmFtZTsKCQoJcHVibGljOiAKCQoJVGhpbmcoKTogbmFtZSgpIHsKCQkvLyBub3AKCX0KCQoJdm9pZCBzZXROYW1lKGNvbnN0IHN0cmluZyBuYW1lKSB7CgkJdGhpcy0+bmFtZSA9IG5hbWU7Cgl9CgkKCWNvbnN0IHN0cmluZyBnZXROYW1lKCkgewoJCXJldHVybiB0aGlzLT5uYW1lOwoJfQp9OwoKdm9pZCBGb28oc2hhcmVkX3B0cjxUaGluZz4gJiBvbmUsIHNoYXJlZF9wdHI8VGhpbmc+IHR3bykKewoJb25lLT5zZXROYW1lKCJmb28iKTsKCQoJb25lID0gdHdvOwp9Cgp2b2lkIFRlc3Qoc3RyaW5nIHJlc3VsdCkKewoJc2hhcmVkX3B0cjxUaGluZz4gb25lKG5ldyBUaGluZygpKTsKCXNoYXJlZF9wdHI8VGhpbmc+IHR3byhuZXcgVGhpbmcoKSk7CglGb28ob25lLCB0d28pOwoJCglhc3NlcnQob25lLT5nZXROYW1lKCkgPT0gcmVzdWx0KTsKfQoKaW50IG1haW4oKSB7CglUZXN0KCJmb28iKTsKCVRlc3QoImJhciIpOwoJCglyZXR1cm4gMDsKfQ==