    #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)};
    }
