为什么std :: move适用于常量对象

时间:2018-05-01 23:06:35

标签: c++

为什么以下代码是合法的。根据我的理解,测试的构造函数参数s1指的是常量对象,在调用std :: move()之后,应该改变对象的状态所以它应该给出错误但是它的工作。

#include <iostream>
#include<memory>
#include <string>
using namespace std;

class test
{
   string s;
public:
  test( const string& s1) : s(std::move(s1))
  {

  }
};
int main()
{
  test t1("data");
}

1 个答案:

答案 0 :(得分:4)

因为std::move会使对象移动。它实际上并没有移动任何东西。那将是s的移动构造函数。

但是由于此处移动的结果仍然是const,因此它不会调用移动构造函数。它将调用复制构造函数。

试试吧。你会看到。