代码之家  ›  专栏  ›  技术社区  ›  Hasan Emrah Süngü

std::is_trivily_copyable/std::is_trivaly_copy_assignable和数组包装类

  •  0
  • Hasan Emrah Süngü  · 技术社区  · 3 年前

    我正试着把头绕过来 std::is_trivially_copy_assignable<T> std::is_trivially_copyable<T> .

    据我所知, std::is_trivily_copy_assignable<T> 检查一个简单的(非用户定义的,默认的)复制运算符,而 std::is_trivily_copyable<T> 检查使用是否安全 memcpy 关于类型 T 根据定义,每个 is_trivially_copyable 必须是 is_trivially_copy_assignable 但并非相反。我希望我的定义是正确的。

    现在我有以下POD类型的类:

    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_trivily_copy_assignable的情况下,简单的复制分配是如何工作的?

    1 回复  |  直到 3 年前
        1
  •  1
  •   Nicol Bolas    3 年前

    值得注意的是,标准定义类型(如数组)的琐碎可复制性规则与类类型的规则不同。对于标准定义的类型,它们可以通过以下方式轻松复制 菲亚特 :因为标准上说它们是。

    类型的元素数组 T 在某种程度上可以轻松地复制 T 很容易被复制。数组是不可分配的,因为标准规定数组不可分配。没有矛盾,因为两者都不需要对方。

    琐碎可复制性和赋值能力之间的任何显式需求关系只存在于类类型中。即便如此,C++14允许一个类型在删除其复制赋值运算符后可以轻松复制,因此甚至不需要类类型的赋值能力。