1

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

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

我可以从调用std::move文字中获得什么实际的“好处”?

4

1 回答 1

2

我可以从调用std::move文字中获得什么实际的“好处”?

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

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

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

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

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

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

于 2017-07-19T13:00:52.887 回答