#include <iostream>
using namespace std;
struct S {
S() { cout << this << "->S()" << endl; }
// куча конструкторов, чтобы убедиться, что мы нечаянно не сделали копию
// было бы достаточно объявить их как =delete
S(S&& t) { cout << this << "->S(&& " << &t << ")" << endl; }
S(const S& t) { cout << this << "->S(const& " << &t << ")" << endl; }
~S() { cout << this << "->~S()" << endl; }
};
// обман компилятора, чтобы он не ругался на взятие адреса у временного объекта
S* addr(const S& t) { return const_cast<S*>(&t); }
S* f(S* p = addr(S())) {
cout << "f(" << p << ")" << endl;
return p;
}
int x(int v) {
cout << "x(" << v << ")" << endl;
return v;
}
void g(int a, S& t, int b) {
cout << "g(" << a << ", &" << &t << ", " << b << ")" << endl;
}
int main() {
cout << "--- begin ---" << endl;
g(x(1), *f(), x(2));
cout << "--- end ---" << endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IFMgewoJUygpIHsgY291dCA8PCB0aGlzIDw8ICItPlMoKSIgPDwgZW5kbDsgfQoJLy8g0LrRg9GH0LAg0LrQvtC90YHRgtGA0YPQutGC0L7RgNC+0LIsINGH0YLQvtCx0Ysg0YPQsdC10LTQuNGC0YzRgdGPLCDRh9GC0L4g0LzRiyDQvdC10YfQsNGP0L3QvdC+INC90LUg0YHQtNC10LvQsNC70Lgg0LrQvtC/0LjRjgoJLy8g0LHRi9C70L4g0LHRiyDQtNC+0YHRgtCw0YLQvtGH0L3QviDQvtCx0YrRj9Cy0LjRgtGMINC40YUg0LrQsNC6ID1kZWxldGUKCVMoUyYmIHQpIHsgY291dCA8PCB0aGlzIDw8ICItPlMoJiYgIiA8PCAmdCA8PCAiKSIgPDwgZW5kbDsgfQoJUyhjb25zdCBTJiB0KSB7IGNvdXQgPDwgdGhpcyA8PCAiLT5TKGNvbnN0JiAiIDw8ICZ0IDw8ICIpIiA8PCBlbmRsOyB9Cgl+UygpIHsgY291dCA8PCB0aGlzIDw8ICItPn5TKCkiIDw8IGVuZGw7IH0KfTsKCi8vINC+0LHQvNCw0L0g0LrQvtC80L/QuNC70Y/RgtC+0YDQsCwg0YfRgtC+0LHRiyDQvtC9INC90LUg0YDRg9Cz0LDQu9GB0Y8g0L3QsCDQstC30Y/RgtC40LUg0LDQtNGA0LXRgdCwINGDINCy0YDQtdC80LXQvdC90L7Qs9C+INC+0LHRitC10LrRgtCwClMqIGFkZHIoY29uc3QgUyYgdCkgeyByZXR1cm4gY29uc3RfY2FzdDxTKj4oJnQpOyB9CgpTKiBmKFMqIHAgPSBhZGRyKFMoKSkpIHsKCWNvdXQgPDwgImYoIiA8PCBwIDw8ICIpIiA8PCBlbmRsOwoJcmV0dXJuIHA7Cn0KCmludCB4KGludCB2KSB7Cgljb3V0IDw8ICJ4KCIgPDwgdiA8PCAiKSIgPDwgZW5kbDsKCXJldHVybiB2Owp9Cgp2b2lkIGcoaW50IGEsIFMmIHQsIGludCBiKSB7Cgljb3V0IDw8ICJnKCIgPDwgYSA8PCAiLCAmIiA8PCAmdCA8PCAiLCAiIDw8IGIgPDwgIikiIDw8IGVuZGw7Cn0KCmludCBtYWluKCkgewoJY291dCA8PCAiLS0tIGJlZ2luIC0tLSIgPDwgZW5kbDsKCWcoeCgxKSwgKmYoKSwgeCgyKSk7Cgljb3V0IDw8ICItLS0gZW5kIC0tLSIgPDwgZW5kbDsKfQ==