我已经阅读了有关不同价值类别的SO的所有主要问题,但仍然没有清楚地理解xvalues与prvalues之间的区别。
我知道,像所有glvalues一样,xvalues的动态类型与静态类型不同,但是如果是文字vs std::move
来自文字我无法找到真实的'行为差异(可能除了那些正式基于什么样的xvalue和什么样的prvalue的那些,就像在MyClass(std::move(5))
中调用哪个构造函数一样;但它似乎并不重要文字的情况,因为他们的价值观无论如何都不会被使用。
实际的利益是什么'我可以通过在文字上调用std::move
来获取?
答案 0 :(得分:2)
实际的利益是什么'我可以通过在文字上调用
std::move
来获取?
无。 (非字符串)文字是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
循环。糟糕。