5 与 std::move(5) 的行为差异
Behavioral differences in 5 vs std::move(5)
我已经阅读了SO上关于不同值类别的所有主要问题,但仍然不清楚在这种情况下,x值与prvalues之间的区别。
我知道,像所有glvalues一样,xvalues的动态类型可以与静态类型不同,但是例如,在文字与文字std::move
的情况下,我找不到"真正的"行为差异(也许除了那些正式基于什么是xvalue和什么是prvalue,比如哪个构造函数将在MyClass(std::move(5))
中被调用;但在文字的情况下,这似乎并不那么重要,因为它们的值无论如何都不会被使用。
我从文字上调用std::move
可以获得的实际"好处"是什么?
我从文字上调用
std::move
可以获得什么实际的"好处"?
没有。(非字符串(文本是一个 prvalue,它是一个 prvalue。调用std::move()
会给你一个 x值,但这仍然是一个右值。没有办法重载 xvalue 和 prvalue 之间的差异 - 您只能重载左值和右值之间的差异 - 因此没有后续差异。
但是,如果我们概括为在 prvalue 上调用std::move
,则有一个很大的反好处:在某些可能需要的地方,您会失去暂时的寿命延长。考虑:
SomeContainer foo();
for (auto&& elem : foo()) { ... }
这工作正常。您可以迭代这样的 prvalue。但是,这根本不起作用:
SomeContainer foo();
for (auto&& elem : std::move(foo())) { ... }
我们仍然有一个类型SomeContainer
的 右值,但现在我们的临时值绑定到move()
的引用参数,因此在进入for
循环的主体之前它超出了范围。哎呀。
相关文章:
- Usages of std::move
- 在C++中对T*类型执行std::move的意外行为
- 关于std::move的使用,是否有编译警告
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 通过实例理解std::move及其目的
- 返回一个带有 std::move 的对象并链接函数
- 当 std::move 与 C 样式数组或不移动对象时会发生什么
- std::move a const std::vector in a lambda capture
- "std::forward"和"std::move"真的不生成代码吗?
- 如何在没有 std::move 的情况下移动临时对象
- 关于在成员重载中使用 std::move() 的问题
- 显式清除 std::move 之后的源资源
- std::move 如何使原始变量的值无效?
- 复制elision、std::move和链式函数调用
- 如果真的需要std::move,我们应该什么时候声明右值refs
- 使用std::move将std::unique_ptr作为qt信号参数传递
- 无法使用带有 std::move 的自定义删除器插入 std::unique_ptr
- C++:我应该在 return 语句中显式使用 std::move() 来强制移动吗?
- 编译器是否足够聪明,以至于 std::move 变量超出范围?
- std::move() 或其在局部变量上的显式等价物可以允许 elision 吗?