c++ - std::is_trivially_xxx 其中一个暗示另一个

标签 c++ c++17

我很难理解以下概念:

  • 是_trivially_copyable
  • is_trivially_copy_assignable
  • 是_trivially_copy_constructible
  • 是_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 不感兴趣:

  • 是_trivially_constructible
  • is_trivially_default_constructible

最佳答案

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

If T is a TriviallyCopyable type, provides the member constant value equal true. For any other type, value is false.

以及 TriviallyCopyable 的要求是:

  • Every copy constructor is trivial or deleted
  • Every move constructor is trivial or deleted
  • Every copy assignment operator is trivial or deleted
  • Every move assignment operator is trivial or deleted
  • at least one copy constructor, move constructor, copy assignment operator, or move assignment operator is non-deleted
  • Trivial non-deleted destructor

您甚至可以检查 llvm implementation .

这与 rule of zero 有关.

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

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

关于c++ - std::is_trivially_xxx 其中一个暗示另一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58393491/

相关文章:

c++ - Windbg源代码调试,在本地窗口中看不到本地变量

c++ - C++中的模板类

c++ - 如何将实现链接到另一个库的接口(interface)?

c++ - 我在哪里可以下载 boost::asio::ssl 的 ca.pem 文件?

c++ - 在glsl中初始化全局变量?

c++ - `std::filesystem::path::operator/(/*args*/)` 没有按预期工作

c++ - 为什么 pmr::string 在这些基准测试中这么慢?

c++ - 模板实例化导致函数膨胀

c++ - variant<int, string> 可以是 constexpr 吗?

c++ - 如何将模板 lambda 传递给函数并将其与不同类型一起使用