When you call drop, a consuming function, the first thing that happens is that ncType is "moved" to a temporary location, then drop() is called on that location.
Moving the value from ncType to a temporary location means ncType is considered uninitialized.
Calling drop while leaving ncType uninitialized property means your uninitialized ncType property is reachable during the call. For instance you could have a global variable with an ExampleClass and then try to read it's ncType inside drop.
(As an optimization, the compiler might skip the move and "reuse" the "uninitialized" memory in ncType for the call to drop, or it might not. You can't count on that. Small structs are likely to be passed around in registers for instance.)
I noticed that too. The error message makes not sense, so it's a bit hard to figure out. Make the property final and it makes more sense, only because now the property name is mentioned. I think the error has something to do with how classes implement properties so they can be overridden in subclasses. When the property or the class is final I think it should be allowed, otherwise it'd need some sort of consuming accessor.
In any case, you can easily use swap for this. But I think you're right to say class properties seem to have some issues with non-copyable types.