Move operations (move constructor, move assignment operator) are all about efficient resource stealing. When stealing resources from the source, you don't have to allocate any memory or perform any other operation that might fail. This is why most people will expect move operation to be non-throwing.
Additionally, if a move operation fails, the source object can have been partially altered by the move, making recovery very tricky, or just impossible. Therefore, to ensure robustness, some functions (for instance, ``++std::move_if_noexcept++``, used by ``++std::vector++``) will decide to copy your object if its move operations are not decorated with ``++noexcept++``. This can significantly slow down your program.
Swap operations are very similar to move operations, in that they should be equivalent to moving two objects into each other. So if you are adding a swap function to your type, it should be _noexcept_ too.