std::is_trivially_xxx 哪个暗示另一个

std::is_trivially_xxx which one imply another

本文关键字:暗示 另一个 trivially is std xxx      更新时间:2023-10-16

我很难理解以下概念:

  • is_trivially_copyable
  • is_trivially_copy_assignable
  • is_trivially_copy_constructible
  • is_trivially_destructible
  • is_trivially_move_assignable

std::string_view为例。

#include <string_view>
int main(){
using sv = std::string_view;
//    static_assert(std::is_trivial_v<sv> );
static_assert(std::is_trivially_copyable_v<sv> );
static_assert(std::is_trivially_copy_assignable_v<sv> );
static_assert(std::is_trivially_copy_constructible_v<sv> );
static_assert(std::is_trivially_destructible_v<sv> );
static_assert(std::is_trivially_move_assignable_v<sv> );
}

我的问题是其中哪一个暗示了其他内容,所以我可以在代码中减少static_assert?

我知道is_trivial暗示所有这些,

注意我对 c-tors 不感兴趣:

  • is_trivially_constructible
  • is_trivially_default_constructible

std::is_trivially_copyable涵盖了其余部分,但允许删除相关方法。它说:

如果 T 是简单可复制的类型,则提供等于 true 的成员常量值。对于任何其他类型,值为 false。

简单可复制的要求是:

  • 每个复制构造函数都是微不足道的或删除
  • 每个移动构造函数都是微不足道或删除
  • 每个复制赋值运算符都是微不足道的或删除
  • 每个移动分配运算符都是微不足道或删除的
  • 至少一个复制构造函数
  • 、移动构造函数、复制赋值运算符或移动赋值运算符未删除
  • 普通的未删除析构函数

您甚至可以检查 llvm 实现。

这与零规则有关。

AFAIK测试的其余部分是基本的,在逻辑含义方面彼此无关。

除了您提到的测试之外,is_copy_assignableis_copy_constructible(可能还有其他"复制"版本(可以用无复制测试来制定,例如is_assignable.但这是不同的,因为检查"copy"只是添加额外的类型约束。

相关文章: