簡體   English   中英

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>檢查是否可以安全地在 Type T上使用memcpy 根據定義,每個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;

即使 arrays 本身不可復制分配,在 is_trivially_copy_assignable 的情況下,普通復制分配如何工作?

需要注意的是,標准定義類型(如數組)的可復制性規則與 class 類型的規則不同。 對於標准定義的類型,它們可以通過fiat簡單地復制:因為標准說它們是。

類型T的元素數組在T可平凡復制的范圍內是可平凡復制的。 數組不可分配,因為標准規定 arrays 不可分配。 沒有矛盾,因為兩者都不需要另一個。

瑣碎可復制性和可分配性之間的任何明確要求關系僅存在於 class 類型。 即便如此,C++14 允許一個類型在其復制賦值運算符被刪除的情況下被簡單地復制,因此 class 類型甚至不需要分配能力。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM