簡體   English   中英

is_trivially_copyable 在我實現的構造函數和默認構造函數之間的行為不同

[英]is_trivially_copyable behaves differently between the constructor I implemented and the default

有 std::is_trivially_copyable https://en.cppreference.com/w/cpp/types/is_trivially_copyable的演示代碼

void test()
{
    struct A {
        int m;
        A(const A& o):m(o.m){}
    };

    struct D {
        int m;

        D(D const&) = default; // -> trivially copyable
        D(int x) : m(x + 1) {}
    };

    std::cout << std::is_trivially_copyable<A>::value << '\n';
    std::cout << std::is_trivially_copyable<D>::value << '\n';
}

A 不可復制,D 可以。 我用默認行為實現了 A 的復制構造函數。 是什么導致了差異?

這是在 c++ 中定義的方式: https://en.cppreference.com/w/cpp/language/copy_constructor#Trivial_copy_constructor

平凡的復制構造函數 如果滿足以下所有條件,則 class T 的復制構造函數是平凡的:

  • 它不是用戶提供的(也就是說,它是隱式定義的或默認的);
  • T 沒有虛成員函數;
  • T 沒有虛擬基類;
  • 為 T 的每個直接基數選擇的復制構造函數是微不足道的;
  • 為 T 的每個非靜態 class 類型(或 class 類型的數組)成員選擇的復制構造函數是微不足道的;

非聯合 class 的普通復制構造函數有效地復制參數的每個標量子對象(包括遞歸地,子對象的子對象等)並且不執行其他操作。 但是,不需要復制填充字節,即使復制的子對象的 object 表示也不必相同,只要它們的值相同即可。

TriviallyCopyable 對象可以通過手動復制它們的 object 表示來復制,例如使用 std::memmove。 與 C 語言(POD 類型)兼容的所有數據類型均可輕松復制。

這不是微不足道的,因為它是用戶定義的。 這就是規則。

編譯器不需要確定您的代碼是否與生成的代碼相同。 你的工作就是弄清楚。 :-)

暫無
暫無

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

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