我有以下课程:
class Student
{
private:
std::string firstName;
std::string lastName;
public:
Student():firstName(""), lastName("")
{
}
Student(const std::string &first, const std::string &last)
:firstName(first), lastName(last)
{
}
Student(const Student &student)
:firstName(student.firstName), lastName(student.lastName)
{
}
Student(Student &&student)
{
firstName=std::move(student.firstName);
lastName=std::move(student.lastName);
}
// ... getters and setters
};
我这样用:
std::vector<std::shared_ptr<Student>> students;
std::shared_ptr<Student> stud1 = std::make_shared<Student>("fn1","ln1");
students.push_back(stud1);
Student stud2("fn2","ln2");
students.push_back(std::make_shared<Student>(std::move(stud2)));
从我所看到的,移动构造函数由编译器自动生成。
现在,当我走进这一行students.push_back(std::make_shared<Student>(std::move(stud2)));
时,我到达了移动构造函数,这没关系。
如果我在进入该行时注释掉移动构造函数,我会到达复制构造函数。 我不明白为什么会这样。
答案 0 :(得分:3)
Visual C ++ 2012不会隐式生成移动构造函数或移动赋值运算符。
(在标准化期间,管理移动操作的时间和未隐式声明和定义的规则已多次更改; Visual C ++ 2012不支持 标准化(2011)规则集。)
答案 1 :(得分:1)
在您的情况下,您可以简单地声明所有这些构造函数=default
,例如
class student
{
std::string firstname, surname;
public:
student(student const&) = default;
student(student&&) = default;
student&operator=(student const&) = default;
student&operator=(student&&) = default;
// etc
};
并且不要担心细节:编译器应该对此进行排序并生成对std::string::string(string&&)
的适当调用(移动构造函数)。
编辑当然,这不适用于有缺陷的编译器,但如果你标记“C ++ 11”,那么你应该期待一个C ++ 11答案。