Open
Description
原文:
std::move 宣告对象的数据即将被转移到其他对象,转移之后对象在逻辑上不再有效,不应再被使用。
单看这句话并无什么太过分的问题,但是主要在于:类似的话术传播非常广泛和深远,让人对于移动语义和 std::move
抱有了很多不切实际的幻想,认为它是编译器做了什么魔法,std::move
了就不能再使用。
原文描述本身并无太大问题,但是我认为总归还是可以改进的,前半句是没有太多问题的,也是一种“君子协定”,让开发者们约定了,自己定义的类的移动构造、移动赋值等函数,是转移资源所有权。
这里的重点在于移动构造、移动赋值等函数,而非是 std::move
本身,std::move 实际几乎什么也没做,它只是将左值表达式转换到亡值表达式,用以匹配移动构造、移动赋值等函数;
“移动”,是 std::move
的语义上的,而非实际作用上的。
原文描述的:“std::move 宣告对象的数据即将被转移到其他对象”,这里“宣告”,其实就是指的语义上的“移动”,一种暗示,我能明白其表达含义。
总而言之,我认为应该强调:
- 移动之后的对象,它的状态取决于移动构造、移动赋值等函数本身的实现,而非是编译器魔法,到底能否重新使用,也取决于各位的实现,通常来说,重新对对象进行初始化,是可以再次正确使用的。
- std::move 本身。
虽然这可能让此规则不那么简洁,但是对后人来说,大大减小难度,也可以避免中文互联上的无数的对移动语义的错误信息传播误导。
Metadata
Metadata
Assignees
Labels
No labels