std::is_trivially_xxx 哪个暗示另一个
std::is_trivially_xxx which one imply another
我很难理解以下概念:
- 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_assignable
和is_copy_constructible
(可能还有其他"复制"版本(可以用无复制测试来制定,例如is_assignable
.但这是不同的,因为检查"copy"只是添加额外的类型约束。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 运行同一解决方案的另一个项目的项目
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- C++从另一个类访问公共静态向量的正确方法是什么
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 使用std::transform将一个范围的元素添加到另一个范围中
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 修改函数中的指针(将另一个指针作为参数传递)
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- C++试图读取一个文件并输出到另一个文本文件
- 如何将指针从一个void函数传递到另一个C++
- 如何从另一个文件继承私有成员变量和公共函数
- 使用.find函数在c++中查找字符和另一个字符之间的大小
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- C++-我可以创建另一个类的成员并在构造函数中使用它吗
- 如何在C++中将函数发送到另一个进程
- std::is_trivially_xxx 哪个暗示另一个