You're abusing the system by accessing a.num after the move, except for the purpose of destroying a.
However it's not C-style "undefined behaviour". std::move converts an l-value to an r-value, which
esnures that the move constructor, if it exists, is called. That's all it does. Whilst for commonsense
purposes you can say "a is invalid because of the std::move", this isn't actually what happens.