为什么GCC和 Clang会把这种类型视为可平凡拷贝的类型,而MSVC则不是?

编程语言 2026-07-10
#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>;
}

LIVE

显然,拷贝/移动构造函数和赋值运算符都不符合条件:eligible:

  • 该函数未被删除

然而我的输出是:

期望结果为false: true

在gcc与 clang下

只有MSVC给出:

期望结果为false: false

在使用gcc和 clang时,我需要为它添加一个主体(即使是空的)才能得到正确的答案 ILT_NotTCopy(ILT_NotTCopy const&) {}

顺便提一句,clang能正确将其报告为一个隐式生命周期类型,具备一个可满足条件的平凡构造函数(默认构造函数)(https://eel.is/c++draft/class.prop#8)以及一个隐式生成的默认构造函数。

解决方案

可平凡拷贝意味着可以通过逐字节复制内存来实现有效拷贝(例如通过 memcpy)。由于你的类没有任何非平凡的拷贝成员(int 是可平凡拷贝的)且没有非平凡的构造函数或非平凡的析构函数,因此你的类是可平凡拷贝的。

通过定义一个非平凡的构造函数(例如 ILT_NotTCopy(ILT_NotTCopy const&) {})你会让你的类变成非平凡可拷贝的。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章