Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

R2.9 “对象被移动后不应再被使用”描述与规则可以改进 #48

Open
Mq-b opened this issue Feb 2, 2024 · 1 comment

Comments

@Mq-b
Copy link
Contributor

Mq-b commented Feb 2, 2024

原文:

std::move 宣告对象的数据即将被转移到其他对象,转移之后对象在逻辑上不再有效,不应再被使用。

单看这句话并无什么太过分的问题,但是主要在于:类似的话术传播非常广泛和深远,让人对于移动语义和 std::move 抱有了很多不切实际的幻想,认为它是编译器做了什么魔法,std::move 了就不能再使用

原文描述本身并无太大问题,但是我认为总归还是可以改进的,前半句是没有太多问题的,也是一种“君子协定”,让开发者们约定了,自己定义的类的移动构造、移动赋值等函数,是转移资源所有权。

这里的重点在于移动构造、移动赋值等函数,而非是 std::move 本身,std::move 实际几乎什么也没做,它只是将左值表达式转换到亡值表达式,用以匹配移动构造、移动赋值等函数

“移动”,是 std::move 的语义上的,而非实际作用上的。

原文描述的:“std::move 宣告对象的数据即将被转移到其他对象”,这里“宣告”,其实就是指的语义上的“移动”,一种暗示,我能明白其表达含义。


总而言之,我认为应该强调:

  1. 移动之后的对象,它的状态取决于移动构造、移动赋值等函数本身的实现,而非是编译器魔法,到底能否重新使用,也取决于各位的实现,通常来说,重新对对象进行初始化,是可以再次正确使用的。
  2. std::move 本身。

虽然这可能让此规则不那么简洁,但是对后人来说,大大减小难度,也可以避免中文互联上的无数的对移动语义的错误信息传播误导。

@brotherbeer
Copy link
Collaborator

好的~ 后续改进

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants