被删除的构造函数是否仍被视为平凡构造函数?
被删除的构造函数是否仍被视为平凡构造函数?
先来看你给出的这个结构体定义:
#include <type_traits> struct S { S(const S &) = delete; S(S &&) = delete; S & operator=(const S &) = delete; S & operator=(S &&) = delete; };
要搞清楚这个问题,得先抠C++标准里对平凡可复制类的核心定义:
一个平凡可复制类是满足以下所有条件的类:
- 拥有至少一个合格的复制构造函数、移动构造函数、复制赋值运算符或移动赋值运算符
- 所有合格的复制构造函数都是平凡的
- 所有合格的移动构造函数都是平凡的
- 所有合格的复制赋值运算符都是平凡的
- 所有合格的移动赋值运算符都是平凡的
- 析构函数是平凡且合格的
这里得先掰明白两个关键细节:
- 被删除的函数属于**不合格(ineligible)**的范畴——标准里说的「合格函数」,特指那些未被删除、可访问,并且能通过重载决议的函数。你显式用
delete标记的这些构造/赋值运算符,直接就被踢出了「合格函数」的圈子。 - 平凡构造函数的判定,只针对合格的函数。而且平凡构造函数要求是编译器默认生成的,还得满足没有任何非平凡操作(比如没有用户自定义逻辑、成员都是平凡类型等)——被删除的函数连实现都不存在,更谈不上是「平凡实现」了。
回到你定义的结构体S:它所有的复制/移动构造、赋值运算符都被删除了,连一个合格的对应函数都没有,首先就不满足平凡可复制类的入门条件。而单独说这些被删除的构造函数,它们根本没资格参与平凡性的判定,自然不能被视为平凡构造函数。
内容来源于stack exchange
相关产品推荐
相关产品推荐

