类要成为TriviallyCopyable,是否所有特殊成员函数都必须平凡?
平凡可复制类(TriviallyCopyable)的特殊成员函数要求
答案很明确:是的,要成为平凡可复制类,所有可用的特殊成员函数(拷贝构造、移动构造、拷贝赋值、移动赋值)都必须是平凡的,同时还得有一个未删除的平凡析构函数。
针对你提到的场景——类拥有平凡的拷贝构造函数,但存在非平凡的移动赋值运算符:
这种类不属于平凡可复制类。因为判定规则明确要求,每一个可用的(即未被删除的)移动赋值运算符都必须是平凡的。只要有一个可用的特殊成员函数不满足平凡性,整个类就不符合要求,不管其他成员函数是否达标。
你提到的“能用memcpy构造或赋值就符合要求”确实是平凡可复制类的核心语义,但C++标准是通过特殊成员函数的属性来定义这个概念的。如果类存在非平凡的移动赋值,说明这个赋值操作无法用memcpy替代(比如涉及动态内存管理、自定义逻辑),本质上违背了平凡可复制的语义,自然也不满足标准的判定条件。
再重申一遍平凡可复制类的完整判定条件:
- 至少拥有一个可用的拷贝构造、移动构造、拷贝赋值或移动赋值运算符;
- 所有可用的拷贝构造函数都是平凡的;
- 所有可用的移动构造函数都是平凡的;
- 所有可用的拷贝赋值运算符都是平凡的;
- 所有可用的移动赋值运算符都是平凡的;
- 拥有未删除的平凡析构函数。
内容的提问来源于stack exchange,提问作者einpoklum
相关产品推荐
相关产品推荐

