行为差异5 vs std :: move(5)

时间:2017-07-19 12:31:31

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

我已经阅读了有关不同价值类别的SO的所有主要问题,但仍然没有清楚地理解xvalues与prvalues之间的区别。

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

实际的利益是什么'我可以通过在文字上调用std::move来获取?

1 个答案:

答案 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循环。糟糕。