Clang 16判定带约束赋值运算符的类非trivially_copyable是否有误?
关于Clang 16/trunk对
trivially_copyable判定的疑问 Clang 16/trunk认为S<int>不是trivially_copyable类,但Clang 15、GCC trunk及MSVC持相反观点。
#include <type_traits> template<typename T> struct S { T m_t; S(S const&) = default; S(S&&) = default; S& operator=(S const&) requires (!std::is_integral<T>::value) = default; ~S() = default; }; // 以下五个断言在所有编译器中均通过 static_assert(std::is_trivially_destructible<S<int>>::value); static_assert(std::is_trivially_copy_constructible<S<int>>::value); static_assert(std::is_trivially_move_constructible<S<int>>::value); static_assert(!std::is_copy_assignable<S<int>>::value); static_assert(!std::is_move_assignable<S<int>>::value); // 可在GCC trunk、MSVC及Clang 15中编译,在Clang 16/trunk中失败 static_assert(std::is_trivially_copyable<S<int>>::value);
根据C++标准中class.prop章节的定义:
trivially copyable类需满足:
- 拥有至少一个可用的拷贝构造函数、移动构造函数、拷贝赋值运算符或移动赋值运算符;
- 所有可用的拷贝构造函数、移动构造函数、拷贝赋值运算符及移动赋值运算符均为trivial;
- 拥有trivial且未删除的析构函数。
S<int>拥有trivial的拷贝/移动构造函数及析构函数,其拷贝/移动赋值运算符不可用。从标准定义来看,S<int>完全符合trivially copyable类的判定条件,因此GCC、MSVC及Clang 15的判定是正确的。
编辑补充:这是一个已确认的Clang Bug。
内容的提问来源于stack exchange,提问作者wanghan02
相关产品推荐
相关产品推荐

