#include <iostream>
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);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgSW50CnsKICAgIGludCBuXzsKCnB1YmxpYzoKICAgIGV4cGxpY2l0IEludChpbnQgbikgbm9leGNlcHQgOiBuXyhuKSB7IHN0ZDo6Y291dCA8PCAiSW50KCIgPDwgbl8gPDwgIilcbiI7IH0KCiAgICBJbnQoSW50IGNvbnN0ICYgcmhzKSA6IG5fKHJocy5uXykgeyBzdGQ6OmNvdXQgPDwgIkludChJbnQgY29uc3QgJilbIiA8PCBuXyA8PCAiXVxuIjsgfQogICAgSW50KEludCAmJiByaHMpICAgICAgOiBuXyhyaHMubl8pIHsgc3RkOjpjb3V0IDw8ICJJbnQoSW50ICYmKSAgICAgWyIgPDwgbl8gPDwgIl1cbiI7IH0KCiAgICB+SW50KCkgeyBzdGQ6OmNvdXQgPDwgIn5JbnQoKVsiIDw8IG5fIDw8ICJdXG4iOyB9CgogICAgSW50ICYgb3BlcmF0b3IrPShJbnQgY29uc3QgJiByaHMpIHsgbl8gKz0gcmhzLm5fOyByZXR1cm4gKnRoaXM7IH0KICAgIEludCAmIG9wZXJhdG9yKz0oSW50ICYmIHJocykgICAgICB7IG5fICs9IHJocy5uXzsgcmV0dXJuICp0aGlzOyB9CgojaWZkZWYgTEFaWQogICAgSW50IG9wZXJhdG9yKyhJbnQgcmhzKSB7IHJldHVybiBJbnQoKnRoaXMpICs9IHN0ZDo6bW92ZShyaHMpOyB9CiNlbHNlCiAgICBJbnQgb3BlcmF0b3IrKEludCBjb25zdCAmIHJocykgeyBJbnQgcmVzdWx0KCp0aGlzKTsgcmVzdWx0ICs9IHJoczsgcmV0dXJuIHJlc3VsdDsgfQogICAgSW50IG9wZXJhdG9yKyhJbnQgJiYgcmhzKSB7IEludCByZXN1bHQoKnRoaXMpOyByZXN1bHQgKz0gc3RkOjptb3ZlKHJocyk7IHJldHVybiByZXN1bHQ7IH0KI2VuZGlmCn07CgoKaW50IG1haW4oKQp7CiAgICBhdXRvIHggPSBJbnQoMTApICsgSW50KDIwKSArIEludCgzMCk7Cn0K