为何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
相关产品推荐
相关产品推荐

