一.强制生成默认函数的关键字default
- 根据以上2,3点,我们知道:
- 没有实现 析构函数 、拷贝构造、拷贝赋值重载 中的任意一个,编译器才会生成默认的移动构造
- 如果我们已经自己生成了三个函数中的某一个,这时编译器不再生成默认的移动构造,但是我们依旧希望他生成,该怎么操作?
- 如下面代码场景所示:
Person(Person&& p) = default;
class Person { public: Person(const char* name = "", int age = 0) :_name(name) , _age(age) {} Person(const Person& p) //我们手动写了拷贝构造 :_name(p._name) , _age(p._age) {} Person(Person&& p) = default; //此时移动构造仍然会生成 private: bit::string _name; int _age; }; int main() { Person s1; Person s2 = s1; Person s3 = std::move(s1); return 0; }
二.禁止生成默认函数的关键字delete
- 只需在该函数声明加上=delete即可,该语法指示编译器不生成对应函数的默认版本,称 =delete修饰的函数为 删除函数
- 如下面代码场景所示:`Person(Person&& p) = delete;
class Person { public: Person(const char* name = "", int age = 0) :_name(name) , _age(age) {} //此时我们没有写析构函数 、拷贝构造、拷贝赋值重载 ,编译器理应默认生成移动构造 Person(Person&& p) = delete; //此时移动构造不会生成 private: bit::string _name; int _age; }; int main() { Person s1; Person s2 = s1; Person s3 = std::move(s1); return 0; }