有没有办法机械地识别移动对象上哪些操作是安全的?

Ad *_*d N 8 c++ static move type-safety c++11

可移动性允许一系列优化.然而,它认为它是以牺牲程序的静态安全性为代价来实现的:

移动后,源对象处于有效但未指定的状态,其中某些操作是合法的,但有些操作是合法的.(特别是关于这个主题的讨论,请参阅这个SO问题).看起来这个操作列表,即使它依赖于每种类型,也可以在编译时知道.然而,编译器并没有警告移动对象的错误使用(正如其他SO问题所讨论的那样).

感觉就像C++哲学一样,依靠编译器尽可能多地验证(静态知道的),其中一个例子是const-correctness enforcing.然而,似乎移动对象可以以危险的方式使用,而编译器不会尝试(或有任何意义)来捕获它们.

实际上是否存在允许编译器更好诊断的机制?如果没有,为什么没有新的限定符应用于可以在移动的对象上使用的方法,或者是否允许等效静态验证的其他机制?

Lig*_*ica 4

可移动性允许进行大量的优化。然而,这样做的代价是在程序的静态安全性上打了一个洞。

是的,它确实。

看起来这个操作列表,即使它依赖于每种类型,也可以在编译时知道。

但一般来说,不是由编译器执行的。

然而,编译器不会警告错误使用移出对象。

不过,那就太好了!

不,您将不得不依赖文档。或者只是做我所做的事情,从左值移出后,永远不要再次使用该对象,除非您有严格控制的范围并且此后立即对该对象进行一些明显的“重置”操作。

当然,从右值转移不会出现这个问题。