5 与 std::move(5) 的行为差异
Behavioral differences in 5 vs std::move(5)
我已经阅读了关于不同值类别的所有主要问题,但仍然不清楚在这种情况下 xvalues 与 prvalues 之间的区别。
我知道,像所有的 glvalues 一样,xvalues 的动态类型可以不同于静态类型,但是例如如果是文字 vs std::move
从文字我找不到 'real' 行为差异(可能除了那些正式基于什么是 xvalue 和什么是 prvalue 的差异,比如哪个构造函数将在 MyClass(std::move(5))
; 但在文字的情况下它似乎并不那么重要,因为它们的值无论如何都不会被使用。
通过对文字调用 std::move
我可以获得的实际 'benefit' 是多少?
What is the actual 'benefit' I can get from calling std::move
on a literal?
None。 (非字符串)文字是纯右值,它是右值。调用 std::move()
会给你一个 xvalue,但它仍然是一个 rvalue。无法重载 xvalue 和 prvalue 之间的差异 - 您只能重载 lvalue 和 rvalue 之间的差异 - 因此没有后续差异。
但是,如果我们概括为对纯右值调用 std::move
,则会有一个很大的反作用:在某些可能需要的地方,您会失去临时的生命周期延长。考虑:
SomeContainer foo();
for (auto&& elem : foo()) { ... }
效果很好。您可以像那样迭代纯右值。但是,这根本不起作用:
SomeContainer foo();
for (auto&& elem : std::move(foo())) { ... }
我们仍然有一个SomeContainer
类型的右值,但是现在我们的临时对象绑定到move()
的引用参数,所以它超出了范围在进入 for
循环体之前。哎呀
我已经阅读了关于不同值类别的所有主要问题,但仍然不清楚在这种情况下 xvalues 与 prvalues 之间的区别。
我知道,像所有的 glvalues 一样,xvalues 的动态类型可以不同于静态类型,但是例如如果是文字 vs std::move
从文字我找不到 'real' 行为差异(可能除了那些正式基于什么是 xvalue 和什么是 prvalue 的差异,比如哪个构造函数将在 MyClass(std::move(5))
; 但在文字的情况下它似乎并不那么重要,因为它们的值无论如何都不会被使用。
通过对文字调用 std::move
我可以获得的实际 'benefit' 是多少?
What is the actual 'benefit' I can get from calling
std::move
on a literal?
None。 (非字符串)文字是纯右值,它是右值。调用 std::move()
会给你一个 xvalue,但它仍然是一个 rvalue。无法重载 xvalue 和 prvalue 之间的差异 - 您只能重载 lvalue 和 rvalue 之间的差异 - 因此没有后续差异。
但是,如果我们概括为对纯右值调用 std::move
,则会有一个很大的反作用:在某些可能需要的地方,您会失去临时的生命周期延长。考虑:
SomeContainer foo();
for (auto&& elem : foo()) { ... }
效果很好。您可以像那样迭代纯右值。但是,这根本不起作用:
SomeContainer foo();
for (auto&& elem : std::move(foo())) { ... }
我们仍然有一个SomeContainer
类型的右值,但是现在我们的临时对象绑定到move()
的引用参数,所以它超出了范围在进入 for
循环体之前。哎呀