2011-01-21 63 views
4

我是POD類型之前聽說不能有私有數據 - 但根據的C++ 0x草案我的要求是寬鬆(重點煤礦):具有所有私人成員的課程是否可以成爲POD課程?

相同的訪問控制(條款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; } 
    }; 
} 

回答

9

C++ 03仍然不允許POD類中的非靜態私有或受保護數據。此要求在定義骨料

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

和POD類必須先聚合。

+0

那麼這個規則在C++ 0x中就放鬆了嗎? (我沒有看到關於POD類型定義的C++ 0x草案中聚合的任何內容) – 2011-01-21 19:15:19

+0

+1。清晰簡潔。 – 2011-01-21 19:15:28

8

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

在C++ 03 POD類型不能有私人數據(見AndreyT的答案)前。

然而,POD的定義已在C++ 0x中更改(請參閱9/10)。

作爲每n3225

甲POD結構是一類既是瑣碎類和一個標準佈局類,並且具有類型非POD結構的沒有非靜態數據成員,非-POD聯合(或這種類型的數組)。
... ...

POD類是一個類,它是POD結構體或POD結合體。

這意味着

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

是POD C++ 0x中因爲demo既瑣碎和標準佈局

標準佈局的定義是在部分9/7

標準佈局類是一類:

  • 具有類型非標準佈局類的沒有非靜態數據成員(或這種類型的陣列)或參考,
  • 沒有虛擬功能(10.3)和沒有虛擬基類(10.1),
  • 具有相同的訪問控制(第11)的所有非靜態數據成員
  • 沒有非標準佈局基類,
  • 或者具有在最派生的類和至多一個基類中沒有非靜態數據成員與 非靜態數據成員,或具有與非靜態數據成員沒有基類,和
  • 具有相同的類型與第一個非靜態數據member.11

的無基類。

那麼,WindowsApi :: Uuid是POD類嗎?

沒有! WindowsApi::Uuid在C++ 03中既不是POD也不在C++ 0x中。一個普通的類是一個有一個微不足道的默認構造函數(12.1),並且是可以複製的。 WindowsApi::Uuid有一個非平凡的默認構造函數。

那麼這個規則在C++ 0x中就放鬆了嗎?

是的! (考慮到第11條)

還檢查了FAQ entry on Aggregates and PODs

+1

那麼「微不足道」的定義是什麼? :) – bdonlan 2011-01-21 19:32:10

-1

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

來自第219頁: POD結構是一個類,它既是一個普通類又是一個標準佈局類,並且沒有類型非POD結構,非POD聯合(或數組)的非靜態數據成員這種類型)。

一個不重要類是具有平凡缺省構造,是平凡的可複製一個類:

一個平凡的可複製類是一類:

  • 沒有非平凡的拷貝構造函數(12.8) ,
  • 沒有非平凡的舉動構造函數(12.8),
  • 沒有非平凡的拷貝賦值運算符(13.5.3,12.8),
  • 沒有非平凡的舉動assig (13.5.3,12.8)和
  • 有一個微不足道的析構函數(12.4)。

標準佈局類是一類:

  • 具有類型非標準佈局類(或這些類型的陣列)或參考的沒有非靜態數據成員,
  • 沒有虛函數(10.3),並且沒有虛基類(10.1),
  • 具有用於所有非靜態數據成員相同的訪問控制(第11),
  • 沒有非標準佈局基類,
  • 要麼在派生最多的類中最多有一個非靜態數據成員,要麼最多有一個基類帶有非靜態數據成員,或者沒有包含非靜態數據成員的基類,並且
  • 沒有基類與第一個非靜態數據成員類型相同。

由於WindowsApi沒有違反任何這些約束,它將是C++ 0x下的有效POD類。正如AndreyT所言,這比C++ 03更爲慷慨。