Move constructor forces copy assignment to be implicitly defaulted?

This is an interesting example, but it muddies things a bit. The std::string member in A is not nothrow-copy-constructible, which is why B is initially not nothrow-move-constructible (though it is still move-constructible, as std::string is copy-constructible); this all follows from the Note in 12.8 p9. Once that is clear, the point of the example comes through; namely, that the move constructor that had been undeclared as per 12.8 p9 can be explicitly declared and defined as defaulted, and the default definition will be nothrow-move-constructible all the way down.