为什么以下代码是合法的。根据我的理解,测试的构造函数参数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");
}
答案 0 :(得分:4)
因为std::move
会使对象移动。它实际上并没有移动任何东西。那将是s
的移动构造函数。
但是由于此处移动的结果仍然是const
,因此它不会调用移动构造函数。它将调用复制构造函数。
试试吧。你会看到。