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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 02:25:07