为什么 std::is_trivial 在 C++26 中被弃用?

问题描述 投票:0回答:1
自 C++20 起,

std::is_pod
已被弃用,这个问题的答案告诉我们应该使用
std::is_standard_layout
+
std::is_trivial
来代替。

但是,对于 C++26,现在

std::is_trivial
也已弃用。这是为什么?我们应该用什么来代替?

c++ type-traits c++26 trivially-copyable
1个回答
0
投票

此更改来自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
是微不足道的,以防不清楚。

© www.soinside.com 2019 - 2024. All rights reserved.