std::is_pod
已被弃用,这个问题的答案告诉我们应该使用 std::is_standard_layout
+ std::is_trivial
来代替。
std::is_trivial
也已弃用。这是为什么?我们应该用什么来代替?
此更改来自P3247:弃用平凡类型的概念。
std::is_trivial
的问题在于它混合了两种不同的检查:
std::is_trivial
有点没用这两个检查用于不同的情况,因此将它们捆绑在一起形成一个特征并不是很有用。 例如,一个容器显式管理存储在
std::byte[]
中的对象的生命周期(如std::vector
)
std::memcpy
复制其内容以实现可简单复制的类型,并且 std::memcpy
复制分配其内容,以实现简单的复制分配类型。知道一个类型是否平凡有点无用,因为我们通常对更具体的属性感兴趣。 当然,在一些罕见的情况下,我们想要知道这两个属性,并且
std::is_trivial
提供了一些便利,但是仅仅分别要求简单的可复制性和简单的默认构造并不是很多工作。
std::is_trivial
可能是一个陷阱开发人员可能会认为,如果
std::is_trivial
为真,则类型在各个方面都是“完全微不足道的”,包括赋值。
然而,该提案提供了一个反例:
struct S { const int i; };
可以简单地复制,但不可分配。想要用S
替换复制分配的用户应该使用memcpy
进行检查;仅检查is_trivially_copy_assignable
或is_trivial
作为分配的前提条件会限制用户代码。is_trivially_copyable
请注意,
S
是微不足道的,以防不清楚。