#include <iostream>
#include <iomanip>
class A {
public:
A() { std::cout << "ctor A" << std::hex << this << std::endl ; }
A(const A&) { std::cout << "cctor A" << std::hex << this << std::endl ; }
~A() { std::cout << "dtor A" << std::hex << this << std::endl ; }
} ;
class B {
public:
A f1() {
std::cout << "before f2()" << std::endl ;
const A& a = f2();
std::cout << "after f2()" << std::endl ;
/*Какие-то вычисления. Просто "return f2();", чтобы без лишних копирований, сделать не удасться.*/
return a;
}
private:
virtual const A& f2() {
std::cout << "f2() create object a" << std::endl ;
A a;
std::cout << "f2() return reference for object a" << std::endl ;
return a;
}
} ;
int main()
{
B b ;
b.f1() ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KCmNsYXNzIEEgewpwdWJsaWM6CiAgICBBKCkgeyBzdGQ6OmNvdXQgPDwgImN0b3IgQSIgPDwgc3RkOjpoZXggPDwgdGhpcyA8PCBzdGQ6OmVuZGwgOyB9CiAgICBBKGNvbnN0IEEmKSB7IHN0ZDo6Y291dCA8PCAiY2N0b3IgQSIgPDwgc3RkOjpoZXggPDwgdGhpcyA8PCBzdGQ6OmVuZGwgOyB9CiAgICB+QSgpIHsgc3RkOjpjb3V0IDw8ICJkdG9yIEEiIDw8IHN0ZDo6aGV4IDw8IHRoaXMgPDwgc3RkOjplbmRsIDsgfQp9IDsKCmNsYXNzIEIgewogIHB1YmxpYzoKICBBIGYxKCkgewogICAgc3RkOjpjb3V0IDw8ICJiZWZvcmUgZjIoKSIgPDwgc3RkOjplbmRsIDsKICAgIGNvbnN0IEEmIGEgPSBmMigpOwogICAgc3RkOjpjb3V0IDw8ICJhZnRlciBmMigpIiA8PCBzdGQ6OmVuZGwgOwogICAgLyrQmtCw0LrQuNC1LdGC0L4g0LLRi9GH0LjRgdC70LXQvdC40Y8uINCf0YDQvtGB0YLQviAicmV0dXJuIGYyKCk7Iiwg0YfRgtC+0LHRiyDQsdC10Lcg0LvQuNGI0L3QuNGFINC60L7Qv9C40YDQvtCy0LDQvdC40LksINGB0LTQtdC70LDRgtGMINC90LUg0YPQtNCw0YHRgtGM0YHRjy4qLwogICAgcmV0dXJuIGE7CiAgfQogIHByaXZhdGU6CiAgdmlydHVhbCBjb25zdCBBJiBmMigpIHsKICAgIHN0ZDo6Y291dCA8PCAiZjIoKSBjcmVhdGUgb2JqZWN0IGEiIDw8IHN0ZDo6ZW5kbCA7CiAgICBBIGE7CiAgICBzdGQ6OmNvdXQgPDwgImYyKCkgcmV0dXJuIHJlZmVyZW5jZSBmb3Igb2JqZWN0IGEiIDw8IHN0ZDo6ZW5kbCA7CiAgICByZXR1cm4gYTsKICB9Cn0gOwoKCmludCBtYWluKCkKewogICAgQiBiIDsKICAgIGIuZjEoKSA7Cn0K