I think in general, no function should ever “steal” your reference to the TensorImpl and make your Tensor object invalid.
You can always pass everything by value and never use std::move if you want and it will all work.
Afterwards, you can do a minor optimization (remove one version counter bump) by using std::move() when the original Tensor should not be used anymore.