簡體   English   中英

一個包含所有私有成員的類可以是一個 POD 類嗎?

[英]Can a class with all private members be a POD class?

我之前聽說 POD 類型不能有私有數據——但根據 C++0x 草案,我的要求更寬松(強調我的):

對所有非靜態數據成員具有相同的訪問控制(第 11 條)

這似乎表明私人數據是可以的,只要它都是私人的。 我沒有 C++03 的副本來檢查...

那么, WindowsApi::Uuid會是一個 POD 類嗎?

namespace WindowsApi
{
    class Uuid
    {
        union
        {
            ::UUID asUuid; //Win32's UUID struct
            unsigned __int64 asInt64s[2];
            unsigned __int32 asInt32s[4];
        };
    public:
        Uuid() {}
        Uuid(::UUID sourceStructure) : asUuid(sourceStructure) {}
        operator ::UUID() { return asUuid; }
    };
}

我之前聽說 POD 類型不能有私有數據

在 C++03 中,POD 類型不能有私有數據(參見 AndreyT 的回答)。

然而 POD 的定義在 C++0x 中已經改變(見9/10 )。

根據n3225

POD 結構是一個既是普通類又是標准布局類的類,並且沒有非 POD 結構、非 POD 聯合(或此類類型的數組)類型的非靜態數據成員。
……

POD 類是一個既可以是 POD 結構體也可以是 POD 聯合體的類。

這意味着

struct demo
{
   private:
      int a, b;
};

是 C++0x 中的 POD,因為demo既簡單又標准布局

標准布局的定義在第9/7

標准布局類是這樣一個類:

  • 沒有非標准布局類(或此類類型的數組)或引用類型的非靜態數據成員,
  • 沒有虛函數(10.3)和虛基類(10.1),
  • 對所有非靜態數據成員具有相同的訪問控制(第 11 條)
  • 沒有非標准布局的基類,
  • 要么在最派生的類中沒有非靜態數據成員,並且最多有一個具有非靜態數據成員的基類,要么沒有具有非靜態數據成員的基類,並且
  • 沒有與第一個非靜態數據成員相同類型的基類。 11

.

那么,WindowsApi::Uuid 會是一個 POD 類嗎?

不! WindowsApi::Uuid在 C++03 和 C++0x 中都不是 POD。 平凡類是具有平凡默認構造函數(12.1) 且可簡單復制的類。 WindowsApi::Uuid有一個重要的默認構造函數。

那么這個規則在 C++0x 中放松了嗎?

是的! (考慮到第 11 條)

另請查看有關聚合和 POD常見問題解答條目

C++03 仍然不允許在 POD 類中使用非靜態私有或受保護的數據。 該要求在聚集體的定義中指定

聚合是一個數組或類(第 9 條),沒有用戶聲明的構造函數(12.1),沒有私有或受保護的非靜態數據成員(第 11 條) ,沒有基類(第 10 條),也沒有虛函數(10.3) )。

並且 POD 類必須首先是一個聚合。

根據我的 n3225 C++0x 草案, WindowsApi::Uuid是一個 POD 類。

從第 219 頁:POD 結構是一個既是普通類又是標准布局類的類,並且沒有非 POD 結構、非 POD 聯合(或此類類型的數組)類型的非靜態數據成員。

平凡類是具有平凡默認構造函數並且可簡單復制的類:

一個普通的可復制類是這樣一個類:

  • 沒有非平凡的復制構造函數(12.8),
  • 沒有非平凡的移動構造函數(12.8),
  • 沒有非平凡的復制賦值運算符 (13.5.3, 12.8),
  • 沒有重要的移動賦值運算符 (13.5.3, 12.8),和
  • 有一個簡單的析構函數 (12.4)。

標准布局類是這樣一個類:

  • 沒有非標准布局類(或此類類型的數組)或引用類型的非靜態數據成員,
  • 沒有虛函數(10.3)和虛基類(10.1),
  • 對所有非靜態數據成員具有相同的訪問控制(第 11 條)
  • 沒有非標准布局的基類,
  • 要么在最派生的類中沒有非靜態數據成員,並且最多有一個具有非靜態數據成員的基類,要么沒有具有非靜態數據成員的基類,並且
  • 沒有與第一個非靜態數據成員相同類型的基類。

由於WindowsApi不違反任何這些約束,因此它將是 C++0x 下的有效 POD 類。 正如 AndreyT 所提到的,這是一個比 C++03 更慷慨的措辭。

暫無
暫無

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

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