std::is_trivially_copyable / std::is_trivially_copy_assignable 和数组换行 类

std::is_trivially_copyable / std::is_trivially_copy_assignable and array wrapping classes

我正在努力思考 std::is_trivially_copy_assignable<T>std::is_trivially_copyable<T>

据我了解,std::is_trivially_copy_assignable<T> 检查普通(非用户定义的默认)复制运算符,而 std::is_trivially_copyable<T> 检查是否可以安全使用 memcpy在类型 T 上。根据定义,每个 is_trivially_copyable 必须是 is_trivially_copy_assignable 但不是其他方式。我希望我的定义是正确的。

现在我有以下 POD 类型 class:

struct Test {
    char data[32];
    int term;
    int dummy[3];
};

当我检查以下内容时:

auto isCopyAssignTrivial = std::is_trivially_copy_assignable<Test>::value; //true
auto isCopyTrivial       = std::is_trivially_copyable<Test>::value; //true

auto isArrayCopyAssignTrivial = std::is_trivially_copy_assignable<int[2]>::value; //false
auto isArrayCopyTrivial       = std::is_trivially_copyable<int[2]>::value; //true

我得到了上面的结果。

此外,当我执行以下操作时,我发现 anotherTestPod 的元素设置正确并且可以正常工作。

Test testPod{};
for(auto &d :testPod.data) {
    d = rand() %100;
}
auto anotherTestPod = testPod;

即使数组本身不可复制赋值,在 is_trivially_copy_assignable 的情况下,简单的复制赋值是如何工作的?

请务必注意,标准定义类型(如数组)的简单可复制性规则与 class 类型的规则不同。对于标准定义的类型,它们可以被 fiat 简单地复制:因为标准说它们是。

T 类型元素的数组在 T 可平凡复制的范围内是平凡可复制的。数组不可赋值,因为标准规定数组不可赋值。没有矛盾,因为两者都不需要另一个。

平凡可复制性和可分配性之间的任何显式需求关系仅存在于 class 类型。即便如此,C++14 允许一个类型在其复制赋值运算符被删除的情况下可以被简单地复制,因此甚至不需要 class 类型的可赋值能力。