【问题标题】:Behavioral differences in 5 vs std::move(5)5 与 std::move(5) 的行为差异
【发布时间】:2017-07-19 12:31:31
【问题描述】:

我已经阅读了关于 SO 有关不同值类别的所有主要问题,但仍然不清楚在这种情况下,xvalues 与 prvalues 之间的区别。

我知道,像所有 glvalues 一样,xvalues 的动态类型可以不同于静态类型,但是例如在文字与 std::move 的情况下,我找不到“真正的”行为差异(可能除了那些正式基于什么是 xvalue 和什么是 prvalue 的差异,比如在 MyClass(std::move(5)) 中将调用哪个构造函数;但它没有'在文字的情况下似乎并不重要,因为它们的值无论如何都不会被使用。

在文字上调用 std::move 可以获得什么实际“好处”?

【问题讨论】:

标签: c++ c++14 xvalue value-categories prvalue


【解决方案1】:

在文字上调用 std::move 可以获得什么实际“好处”?

没有。 (非字符串)文字是纯右值,它是右值。调用std::move() 会给你一个xvalue,但这仍然是一个rvalue。没有办法重载 xvalue 和 prvalue 之间的差异 - 你只能重载 lvalue 和 rvalue 之间的差异 - 所以没有后续差异。

但是,如果我们概括为在prvalue 上调用std::move,则有一个很大的反好处:您在某些可能需要它的地方失去了临时延长寿命。考虑:

SomeContainer foo();
for (auto&& elem : foo()) { ... }

效果很好。你可以迭代这样的prvalue。但是,这根本不起作用:

SomeContainer foo();
for (auto&& elem : std::move(foo())) { ... }

我们仍然有一个SomeContainer 类型的右值,但现在我们的临时值绑定到move() 的引用参数,所以它在for 循环体之前超出范围被输入。哎呀。

【讨论】:

  • 顺便问一下,为什么std::move 没有作为演员表实现?因为它实际上是无条件转换为右值。我知道它实际上是通过static_cast 实现的,但是将其本身作为一种单独的演员表将有助于消除您提到的问题。
  • 并非所有文字都是纯右值,即使我们忽略用户定义的文字。
  • @ledonter 这解决了一个只有在您选择编写没有任何好处的代码时才存在的问题。一个更简单的解决方案是不在那里写move()
  • @T.C.已编辑:)
猜你喜欢
  • 1970-01-01
  • 2013-02-02
  • 2022-01-25
  • 2016-07-08
  • 1970-01-01
  • 1970-01-01
  • 2018-07-28
  • 2016-04-04
  • 2015-05-03
相关资源
最近更新 更多