我今天在人们的答案中看到了这几个地方,比如我有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在这种情况下再次无关紧要,但我可能错过了一些东西。
答案 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
一样。