当类型已经是T&&类型时,为什么std :: move

时间:2014-03-15 17:23:45

标签: c++ c++11

我今天在人们的答案中看到了这几个地方,比如我有Foo的构造函数。

Foo(      std::vector<SomeType>&& data) noexcept : data_(std::move(data)) {};

为什么std :: move(data)是必需的,因为数据已经是std :: vector&lt;类型的数据SOMETYPE&GT;&安培;&安培; ?

std :: move在我看来,它只是将数据转换为std :: vector&lt; SOMETYPE&GT;&安培;&安培;再次?

http://en.cppreference.com/w/cpp/utility/move 定义std :: move as,

static_cast<typename std::remove_reference<T>::type&&>(t)

所以看起来std :: move在这种情况下再次无关紧要,但我可能错过了一些东西。

1 个答案:

答案 0 :(得分:5)

在这两种情况下,

void foo(const T& bar); // 1
void foo(T&& bar);      // 2

bar实际上是lvalue&&意味着重载2将绑定到右值,例如在以下情况下:

foo(Bar());

而重载1会在这里绑定:

T bar;
foo(bar);

2中,您仍需要使用std::move使bar看起来像行为中的rvalue一样。