模板化可变参数构造函数是否影响类型平凡性?C++20中s是否为平凡类型?
C++平凡类型相关问题解答
1. 模板化可变参数构造函数是否会影响一个类型的平凡性?
模板化构造函数本身不会直接让类型失去平凡性,但需结合C++标准对平凡类型的完整判定条件分析:只要类满足拥有平凡默认构造函数、无虚函数/虚基类、所有拷贝/移动操作及析构函数均平凡、成员和基类均为平凡类型这些要求,即使存在模板构造函数,仍可被判定为平凡类型。不过不同编译器对标准细节的解读可能存在差异,会导致判定结果不一致。
2. 根据C++20标准,结构体s是否应被视为平凡类型?
根据C++20标准的定义,结构体s应当被视为平凡类型,理由如下:
- 无虚函数或虚基类;
- 显式默认的默认构造函数
s() = default;不属于“用户提供(user-provided)”的构造函数,满足平凡默认构造函数的要求; - 编译器自动生成的拷贝/移动构造函数、拷贝/移动赋值运算符均为平凡实现;
- 析构函数为默认的平凡实现;
- 无任何非静态数据成员,也无基类,不存在非平凡的成员或基类。
对应测试代码:
#include <type_traits> struct s { s() = default; s(auto...) {} }; static_assert(std::is_trivial_v<s>); // clang不通过,gcc通过,msvc通过
目前clang的判定不符合标准定义,而gcc和msvc的实现符合标准要求。
内容的提问来源于stack exchange,提问作者303
相关产品推荐
相关产品推荐

