我很难理解以下概念:
- 是_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_assignable
和 is_copy_constructible
(以及可能的其他“复制”版本)可以根据无复制测试来制定,例如is_assignable
.但这是不同的,因为检查“复制”只是添加额外的类型约束。
关于c++ - std::is_trivially_xxx 其中一个暗示另一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58393491/