#include <iostream>
class Foo {
public:
Foo() = default;
Foo(const Foo&) = default;
Foo(Foo&&) noexcept = default;
Foo& operator=(const Foo& rhs) & {
std::cout << "copy\n";
return *this;
}
Foo& operator=(Foo&& rhs) & noexcept {
std::cout << "move\n";
return *this;
}
Foo operator+(const Foo& rhs) const {
Foo x; // with some calculation
return x;
}
};
int main() {
Foo a, b, c;
a = b + c;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgRm9vIHsKcHVibGljOgogICAgRm9vKCkgPSBkZWZhdWx0OwoKICAgIEZvbyhjb25zdCBGb28mKSA9IGRlZmF1bHQ7CiAgICBGb28oRm9vJiYpIG5vZXhjZXB0ID0gZGVmYXVsdDsKCiAgICBGb28mIG9wZXJhdG9yPShjb25zdCBGb28mIHJocykgJiB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJjb3B5XG4iOwoKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CgogICAgRm9vJiBvcGVyYXRvcj0oRm9vJiYgcmhzKSAmIG5vZXhjZXB0IHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIm1vdmVcbiI7CgogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KCiAgICBGb28gb3BlcmF0b3IrKGNvbnN0IEZvbyYgcmhzKSBjb25zdCB7CiAgICAgICAgRm9vIHg7IC8vIHdpdGggc29tZSBjYWxjdWxhdGlvbgoKICAgICAgICByZXR1cm4geDsKICAgIH0KfTsKCmludCBtYWluKCkgewogICAgRm9vIGEsIGIsIGM7CgogICAgYSA9IGIgKyBjOwp9