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

cap*_*eve 0 c++ c++11

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

Foo(      std::vector<SomeType>&& data) noexcept : data_(std::move(data)) {};
Run Code Online (Sandbox Code Playgroud)

为什么std :: move(data)是必需的,因为数据类型不是std :: vector <SomeType> &&?

std :: move对我来说,它只是简单地将数据转换为std :: vector <SomeType> &&?

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

static_cast<typename std::remove_reference<T>::type&&>(t)
Run Code Online (Sandbox Code Playgroud)

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

jua*_*nza 5

在这两种情况下,

void foo(const T& bar); // 1
void foo(T&& bar);      // 2
Run Code Online (Sandbox Code Playgroud)

bar实际上是一个lvalue.&&重载2将绑定到右值的意思是什么,例如在以下情况下:

foo(Bar());
Run Code Online (Sandbox Code Playgroud)

而重载1会在这里绑定:

T bar;
foo(bar);
Run Code Online (Sandbox Code Playgroud)

2,您仍然需要使用std::move来使bar外观和行为像rvalue函数内部.