#include <iostream>
struct A {
struct APlusA {
APlusA(const A&a_, const A&b_) : a(a_), b(b_) {}
const A &a;
const A &b;
operator A() const {
std::cout << "Creating temporary A" << std::endl;
return A(a.val + b.val);
}
};
A(int val_) : val(val_) {}
friend APlusA operator+(const A&a, const A&b) { return APlusA(a,b); }
friend std::ostream &operator<<(std::ostream &s, const A &a) { return s << a.val;}
A& operator=(const APlusA &apa) {
if (this == &apa.a) {
std::cout << "Performing in-place operator" << std::endl;
val += apa.b.val;
}
else
{
*this = static_cast<A>(apa);
}
}
int val;
};
int main() {
A a(4), b(5), c(6);
std::cout << a+b << std::endl; //Temporary created
a = b+c; //Temporary created
a = a+b; //No temporary - inplace operation
std::cout << a << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IEEgewoJc3RydWN0IEFQbHVzQSB7CgkJQVBsdXNBKGNvbnN0IEEmYV8sIGNvbnN0IEEmYl8pIDogYShhXyksIGIoYl8pIHt9CgkJY29uc3QgQSAmYTsKCQljb25zdCBBICZiOwoJCQoJCW9wZXJhdG9yIEEoKSBjb25zdCB7IAoJCQlzdGQ6OmNvdXQgPDwgIkNyZWF0aW5nIHRlbXBvcmFyeSBBIiA8PCBzdGQ6OmVuZGw7IAoJCQlyZXR1cm4gQShhLnZhbCArIGIudmFsKTsKCQl9Cgl9OwoKCUEoaW50IHZhbF8pIDogdmFsKHZhbF8pIHt9CglmcmllbmQgQVBsdXNBIG9wZXJhdG9yKyhjb25zdCBBJmEsIGNvbnN0IEEmYikgeyByZXR1cm4gQVBsdXNBKGEsYik7IH0KCWZyaWVuZCBzdGQ6Om9zdHJlYW0gJm9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtICZzLCBjb25zdCBBICZhKSB7IHJldHVybiBzIDw8IGEudmFsO30KCQoJQSYgb3BlcmF0b3I9KGNvbnN0IEFQbHVzQSAmYXBhKSB7CgkJaWYgKHRoaXMgPT0gJmFwYS5hKSB7CgkJCXN0ZDo6Y291dCA8PCAiUGVyZm9ybWluZyBpbi1wbGFjZSBvcGVyYXRvciIgPDwgc3RkOjplbmRsOwoJCQl2YWwgKz0gYXBhLmIudmFsOwoJCX0KCQllbHNlCgkJewoJCQkqdGhpcyA9IHN0YXRpY19jYXN0PEE+KGFwYSk7CgkJfQoJfQoJCglpbnQgdmFsOwp9OwoKaW50IG1haW4oKSB7CglBIGEoNCksIGIoNSksIGMoNik7CglzdGQ6OmNvdXQgPDwgYStiIDw8IHN0ZDo6ZW5kbDsgLy9UZW1wb3JhcnkgY3JlYXRlZAoJYSA9IGIrYzsgICAgICAgICAgICAgICAgICAgICAgIC8vVGVtcG9yYXJ5IGNyZWF0ZWQKCWEgPSBhK2I7ICAgICAgICAgICAgICAgICAgICAgICAvL05vIHRlbXBvcmFyeSAtIGlucGxhY2Ugb3BlcmF0aW9uCglzdGQ6OmNvdXQgPDwgYSA8PCBzdGQ6OmVuZGw7CglyZXR1cm4gMDsKfQo=