[英]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 條)
C++03 仍然不允許在 POD 類中使用非靜態私有或受保護的數據。 該要求在聚集體的定義中指定
聚合是一個數組或類(第 9 條),沒有用戶聲明的構造函數(12.1),沒有私有或受保護的非靜態數據成員(第 11 條) ,沒有基類(第 10 條),也沒有虛函數(10.3) )。
並且 POD 類必須首先是一個聚合。
根據我的 n3225 C++0x 草案, WindowsApi::Uuid
是一個 POD 類。
從第 219 頁:POD 結構是一個既是普通類又是標准布局類的類,並且沒有非 POD 結構、非 POD 聯合(或此類類型的數組)類型的非靜態數據成員。
平凡類是具有平凡默認構造函數並且可簡單復制的類:
一個普通的可復制類是這樣一個類:
標准布局類是這樣一個類:
由於WindowsApi
不違反任何這些約束,因此它將是 C++0x 下的有效 POD 類。 正如 AndreyT 所提到的,這是一個比 C++03 更慷慨的措辭。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.