You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

模板化可变参数构造函数是否影响类型平凡性?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 14:31:09