C++ std::这是一个简单的意思吗

C++ std::这是一个简单的意思吗,c++,c++17,C++,C++17,我很难理解以下概念: 是可复制的吗 是不是可以分配 是可构造的吗 是可破坏的吗 _琐碎_移动_可分配吗 例如std::string\u视图 #include <string_view> int main(){ using sv = std::string_view; // static_assert(std::is_trivial_v<sv> ); static_assert(std::is_trivially_copyable_v<s

我很难理解以下概念:

  • 是可复制的吗
  • 是不是可以分配
  • 是可构造的吗
  • 是可破坏的吗
  • _琐碎_移动_可分配吗
例如
std::string\u视图

#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> );
}
#包括
int main(){
使用sv=std::string\u视图;
//静态断言(std::is_-triple_-v);
静态断言(std::是可复制的);
静态断言(std::is_琐碎地_copy_可分配的_v);
静态断言(std::是可构造的);
静态断言(std::是可破坏的);
静态断言(std::is_琐碎地_移动_可分配的_v);
}
我的问题是,这些中的哪一个暗示了其他,这样我就可以在代码中减少静态的断言

我知道
是微不足道的
意味着所有这些

注:我对c-TOR不感兴趣:

  • 是可构造的吗
  • 是可构造的吗

std::是可复制的
涵盖了其余部分,但允许删除相关方法。它说:

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

有关的资料和要求如下:

  • 每个副本构造函数都是琐碎的或删除的
  • 每个移动构造函数都是琐碎的或删除的
  • 每个副本分配运算符都是琐碎的或已删除的
  • 每个移动分配运算符都是平凡的或已删除的
  • 至少有一个复制构造函数、移动构造函数、复制分配运算符或移动分配运算符未被删除
  • 平凡非删除析构函数
你甚至可以检查一下

这是与环境有关的

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


除了您提到的测试外,
是可复制的
(可能还有其他“复制”版本)可以根据无复制测试来制定,例如。但这是不一样的,因为检查“复制”只是添加了额外的类型约束。

所以基本上测试std::is_littley_copyable是不够的吗?而
std::is_littley_copyable是可复制的
暗示
std::is_littlely_可破坏的吗
?是的,对不起,我误读了原始问题,遗漏了
是可复制的
我几乎完全重新表述了答案,但它应该是正确的,并回答您的问题。因此,你对方法可以删除的挑剔是正确的。答案是这样的,但值得强调:
是可复制的,并不意味着某些东西是可复制的,更不用说
是可复制的。例如
struct A{A(const A&)=delete;}是可复制的,但不是可复制的!