5 与 std::move(5) 的行为差异

Behavioral differences in 5 vs std::move(5)

本文关键字:std move      更新时间:2023-10-16

我已经阅读了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循环的主体之前它超出了范围。哎呀。