何时在`std :: move()`函数中调用移动构造函数?

Ral*_*zky 13 c++ rvalue-reference move-semantics c++11

该功能std::move()定义为

template<typename T>
typename std::remove_reference<T>::type&& move(T && t)
{ 
    return static_cast<typename std::remove_reference<T>::type&&>( t ); 
}
Run Code Online (Sandbox Code Playgroud)

有四个地方我可以想象要调用的移动构造函数:

  1. 参数传递时.
  2. 演员表演时.
  3. 返回结果时.
  4. 不在std::move()函数本身,但可能在返回的引用最终到达的位置.

我敢打赌4号,但我不是百分百肯定,所以请解释你的答案.

Ali*_*Ali 8

没有移动建设正在进行中.std::move()接受引用并返回引用.std::move()基本上只是演员.

你的猜测4.是正确的(假设你实际上是在调用一个移动构造函数).

  • `std :: move`是一个如此愚蠢的名字,因为_it不会移动任何东西_(即因为,是的,答案是'4`).我和委员会成员有过这样的争论,他们认为这很好,因为"人们只会使用`std :: move`作为移动东西的先驱".我觉得这完全违反了C++的_spirit_. (3认同)