#include <exception>
#include <iostream>
#include <type_traits>
class Moveable {
static int s_count;
int m_id;
const char* m_ptr;
public:
Moveable(const char* ptr) : m_id(s_count++), m_ptr(ptr) {
std::cout << "Moveable(ptr) " << m_id << '\n';
}
Moveable(Moveable&& rhs) : m_id(s_count++), m_ptr(nullptr) {
std::cout << "Moveable(&&) " << m_id << " from " << rhs.m_id << '\n';
std::swap(m_ptr, rhs.m_ptr);
}
~Moveable() noexcept(false) {
std::cout << "Release " << m_id << " m_ptr " << (void*)m_ptr << '\n';
}
Moveable(Moveable const &) = delete;
Moveable &operator=(Moveable const &) = delete;
};
int Moveable::s_count;
int main(int argc, char *argv[]) {
Moveable moveable{"hello world"};
Moveable moved{std::move(moveable)};
Moveable moved_again{std::move(moved)};
}
ICAgICNpbmNsdWRlIDxleGNlcHRpb24+CiAgICAjaW5jbHVkZSA8aW9zdHJlYW0+CiAgICAjaW5jbHVkZSA8dHlwZV90cmFpdHM+CgogICAgY2xhc3MgTW92ZWFibGUgewogICAgICBzdGF0aWMgaW50IHNfY291bnQ7CiAgICAgIGludCBtX2lkOwogICAgICBjb25zdCBjaGFyKiBtX3B0cjsKICAgIHB1YmxpYzoKICAgICAgTW92ZWFibGUoY29uc3QgY2hhciogcHRyKSA6IG1faWQoc19jb3VudCsrKSwgbV9wdHIocHRyKSB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJNb3ZlYWJsZShwdHIpICIgPDwgbV9pZCA8PCAnXG4nOwogICAgICB9CgogICAgICBNb3ZlYWJsZShNb3ZlYWJsZSYmIHJocykgOiBtX2lkKHNfY291bnQrKyksIG1fcHRyKG51bGxwdHIpIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIk1vdmVhYmxlKCYmKSAiIDw8IG1faWQgPDwgIiBmcm9tICIgPDwgcmhzLm1faWQgPDwgJ1xuJzsKICAgICAgICBzdGQ6OnN3YXAobV9wdHIsIHJocy5tX3B0cik7CiAgICAgIH0KCiAgICAgIH5Nb3ZlYWJsZSgpIG5vZXhjZXB0KGZhbHNlKSB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJSZWxlYXNlICIgPDwgbV9pZCA8PCAiIG1fcHRyICIgPDwgKHZvaWQqKW1fcHRyIDw8ICdcbic7CiAgICAgIH0KCiAgICAgIE1vdmVhYmxlKE1vdmVhYmxlIGNvbnN0ICYpID0gZGVsZXRlOwogICAgICBNb3ZlYWJsZSAmb3BlcmF0b3I9KE1vdmVhYmxlIGNvbnN0ICYpID0gZGVsZXRlOwogICAgfTsKCiAgICBpbnQgTW92ZWFibGU6OnNfY291bnQ7CgogICAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewogICAgICBNb3ZlYWJsZSBtb3ZlYWJsZXsiaGVsbG8gd29ybGQifTsKICAgICAgTW92ZWFibGUgbW92ZWR7c3RkOjptb3ZlKG1vdmVhYmxlKX07CiAgICAgIE1vdmVhYmxlIG1vdmVkX2FnYWlue3N0ZDo6bW92ZShtb3ZlZCl9OwogICAgfQo=