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

为何GCC与Clang视该类型为trivially copyable,而MSVC却不?

关于std::is_trivially_copyable_v的编译器行为差异
#include <iostream>
#include <type_traits>

struct ILT_NotTCopy {
    int val;
    ILT_NotTCopy() = default;
    ILT_NotTCopy(ILT_NotTCopy const&)= delete;
    ILT_NotTCopy(ILT_NotTCopy&&) = delete;
    ILT_NotTCopy& operator=(ILT_NotTCopy const&) = delete;
    ILT_NotTCopy& operator=(ILT_NotTCopy&&) = delete;
};

int main() {
    std::cout << "expecting false: " << std::boolalpha
              << std::is_trivially_copyable_v<ILT_NotTCopy>;
}

从代码定义来看,ILT_NotTCopy类型没有符合要求的(eligible)拷贝/移动构造函数或赋值运算符——所有相关函数都被显式删除了。按逻辑预期,std::is_trivially_copyable_v<ILT_NotTCopy>应该返回false,但实际运行结果因编译器不同存在差异:

  • GCC和Clang的输出:

    expecting false: true

  • MSVC的输出:

    expecting false: false

在GCC和Clang中,只有给拷贝构造函数添加函数体(哪怕是空实现),比如修改为ILT_NotTCopy(ILT_NotTCopy const&) {},才能得到预期的false结果。

补充说明:Clang能正确将该类型识别为隐式生存期类型(implicit lifetime type),因为它拥有符合要求的平凡构造函数(默认构造函数),且存在隐式生成的默认构造函数,这符合C++标准中关于隐式生存期类型的定义。

内容的提问来源于stack exchange,提问作者Oersted

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.01 12:23:10