C++类的特种函数生成机制

本文探讨了C++类的特种函数(如构造函数、析构函数、拷贝和移动操作符)的生成机制。当类中不声明特定的构造函数时,编译器会自动生成默认构造函数和析构函数。如果类含有不可移动的数据成员(如std::mutex),则类自身也将变得不可移动。同时,文章通过实例解释了为何std::mutex不支持移动构造,并引用了相关源码进行分析。
摘要由CSDN通过智能技术生成

类的特种函数生成机制

规则

参考Effective Morder C++上的说明:

  • 默认构造函数:仅当类中不包含用户声明的构造函数时才生成。
  • 析构函数:默认生成,当基类的析构函数为虚时,派生类的默认析构函数为虚函数。
  • 拷贝构造函数:仅当类中不包含用户声明的拷贝构造函数时才生成。如果该类声明了移动操作,那么拷贝构造函数将被定义为删除的。
  • 拷贝赋值运算符:仅当类中不包含用户声明的拷贝赋值运算符时才生成。如果该类声明了移动操作,那么拷贝赋值运算符将被定义为删除的。
  • 移动构造函数和移动赋值运算符:仅当类中不包含用户声明的拷贝操作、移动操作和析构函数时才生成。

例子:A BUG

因为不熟悉析构函数的生成机制,导致了一个BUG。

首先,下面的代码没有问题,因为数据成员m_是只移型别——std::thread,所以Widget默认也是个只移型别;mm中也可以插入一个由只移型别构造的std::pair<int, Widget>,因为pair默认支持右值参数构造(可以由只移的Widget构造)和自身的移动构造函数(可以移动构造到unordered_map中):

在这里插入图片描述

class Widget {
   
public:
    Widget() = default;
private:
    std::thread m_; // 只移型别
};

unordered_map<int, Widget> mm;
mm.insert({
   12, Widget()});

然后,我手贱加了一个默认的析构函数:

class Widget {
   
public:
    Widget() = 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值