#include <iostream>
struct Noisy {
Noisy() { std::cout << "Default construct" << std::endl; }
Noisy(const Noisy&) { std::cout << "Copy construct" << std::endl; }
Noisy(Noisy&&) { std::cout << "Move construct" << std::endl; }
Noisy& operator=(const Noisy&) { std::cout << "Copy assignment" << std::endl; return *this; }
Noisy& operator=(Noisy&&) { std::cout << "Move assignment" << std::endl; return *this; }
~Noisy() { std::cout << "Destructor" << std::endl; }
int& get() { return x; }
int x = 5;
};
void func(int& x) {
std::cout << "----------" << std::endl;
std::cout << x << std::endl;
std::cout << "----------" << std::endl;
}
int main() {
std::cout << "func()" << std::endl;
func(Noisy{}.get());
std::cout << "Done" << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IE5vaXN5IHsKICAgIE5vaXN5KCkgeyBzdGQ6OmNvdXQgPDwgIkRlZmF1bHQgY29uc3RydWN0IiA8PCBzdGQ6OmVuZGw7IH0KICAgIE5vaXN5KGNvbnN0IE5vaXN5JikgeyBzdGQ6OmNvdXQgPDwgIkNvcHkgY29uc3RydWN0IiA8PCBzdGQ6OmVuZGw7IH0KICAgIE5vaXN5KE5vaXN5JiYpIHsgc3RkOjpjb3V0IDw8ICJNb3ZlIGNvbnN0cnVjdCIgPDwgc3RkOjplbmRsOyB9CiAgICBOb2lzeSYgb3BlcmF0b3I9KGNvbnN0IE5vaXN5JikgeyBzdGQ6OmNvdXQgPDwgIkNvcHkgYXNzaWdubWVudCIgPDwgc3RkOjplbmRsOyByZXR1cm4gKnRoaXM7IH0KICAgIE5vaXN5JiBvcGVyYXRvcj0oTm9pc3kmJikgeyBzdGQ6OmNvdXQgPDwgIk1vdmUgYXNzaWdubWVudCIgPDwgc3RkOjplbmRsOyByZXR1cm4gKnRoaXM7IH0KICAgIH5Ob2lzeSgpIHsgc3RkOjpjb3V0IDw8ICJEZXN0cnVjdG9yIiA8PCBzdGQ6OmVuZGw7IH0KCiAgICBpbnQmIGdldCgpIHsgcmV0dXJuIHg7IH0KICAgIGludCB4ID0gNTsKfTsKCnZvaWQgZnVuYyhpbnQmIHgpIHsKICAgIHN0ZDo6Y291dCA8PCAiLS0tLS0tLS0tLSIgPDwgc3RkOjplbmRsOwogICAgc3RkOjpjb3V0IDw8IHggPDwgc3RkOjplbmRsOwogICAgc3RkOjpjb3V0IDw8ICItLS0tLS0tLS0tIiA8PCBzdGQ6OmVuZGw7Cn0KCmludCBtYWluKCkgewogICAgc3RkOjpjb3V0IDw8ICJmdW5jKCkiIDw8IHN0ZDo6ZW5kbDsKICAgIGZ1bmMoTm9pc3l7fS5nZXQoKSk7CiAgICBzdGQ6OmNvdXQgPDwgIkRvbmUiIDw8IHN0ZDo6ZW5kbDsKfQ==