#include <iostream>
#define LAZY
class Int
{
int n_;
public:
explicit Int(int n) noexcept : n_(n) { std::cout << "Int(" << n_ << ")\n"; }
Int(Int const & rhs) : n_(rhs.n_) { std::cout << "Int(Int const &)[" << n_ << "]\n"; }
Int(Int && rhs) : n_(rhs.n_) { std::cout << "Int(Int &&) [" << n_ << "]\n"; }
~Int() { std::cout << "~Int()[" << n_ << "]\n"; }
Int & operator+=(Int const & rhs) { n_ += rhs.n_; return *this; }
Int & operator+=(Int && rhs) { n_ += rhs.n_; return *this; }
#ifdef LAZY
Int operator+(Int rhs) { return Int(*this) += std::move(rhs); }
#else
Int operator+(Int const & rhs) { Int result(*this); result += rhs; return result; }
Int operator+(Int && rhs) { Int result(*this); result += std::move(rhs); return result; }
#endif
};
int main()
{
auto x = Int(10) + Int(20) + Int(30);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKI2RlZmluZSBMQVpZCgpjbGFzcyBJbnQKewogICAgaW50IG5fOwoKcHVibGljOgogICAgZXhwbGljaXQgSW50KGludCBuKSBub2V4Y2VwdCA6IG5fKG4pIHsgc3RkOjpjb3V0IDw8ICJJbnQoIiA8PCBuXyA8PCAiKVxuIjsgfQoKICAgIEludChJbnQgY29uc3QgJiByaHMpIDogbl8ocmhzLm5fKSB7IHN0ZDo6Y291dCA8PCAiSW50KEludCBjb25zdCAmKVsiIDw8IG5fIDw8ICJdXG4iOyB9CiAgICBJbnQoSW50ICYmIHJocykgICAgICA6IG5fKHJocy5uXykgeyBzdGQ6OmNvdXQgPDwgIkludChJbnQgJiYpICAgICBbIiA8PCBuXyA8PCAiXVxuIjsgfQoKICAgIH5JbnQoKSB7IHN0ZDo6Y291dCA8PCAifkludCgpWyIgPDwgbl8gPDwgIl1cbiI7IH0KCiAgICBJbnQgJiBvcGVyYXRvcis9KEludCBjb25zdCAmIHJocykgeyBuXyArPSByaHMubl87IHJldHVybiAqdGhpczsgfQogICAgSW50ICYgb3BlcmF0b3IrPShJbnQgJiYgcmhzKSAgICAgIHsgbl8gKz0gcmhzLm5fOyByZXR1cm4gKnRoaXM7IH0KCiNpZmRlZiBMQVpZCiAgICBJbnQgb3BlcmF0b3IrKEludCByaHMpIHsgcmV0dXJuIEludCgqdGhpcykgKz0gc3RkOjptb3ZlKHJocyk7IH0KI2Vsc2UKICAgIEludCBvcGVyYXRvcisoSW50IGNvbnN0ICYgcmhzKSB7IEludCByZXN1bHQoKnRoaXMpOyByZXN1bHQgKz0gcmhzOyByZXR1cm4gcmVzdWx0OyB9CiAgICBJbnQgb3BlcmF0b3IrKEludCAmJiByaHMpIHsgSW50IHJlc3VsdCgqdGhpcyk7IHJlc3VsdCArPSBzdGQ6Om1vdmUocmhzKTsgcmV0dXJuIHJlc3VsdDsgfQojZW5kaWYKfTsKCgppbnQgbWFpbigpCnsKICAgIGF1dG8geCA9IEludCgxMCkgKyBJbnQoMjApICsgSW50KDMwKTsKfQo=