2011-03-26 38 views
16

我有一個類和一個const變量。不能C++ POD類型有任何構造函數?

struct A 
{ 
    int b; 
}; 

A const a; 

A是POD,並且可以這樣進行初始化。

A const a = { 3 }; 

恕我直言,它看起來很好有這樣的構造函數。

struct A 
{ 
    int b; 

    A(int newB) : b(newB) 
    { 
    } 
}; 

但Clang假定A爲非聚合類型。爲什麼我不能有這樣的構造函數?還是我應該做點別的?


我修改後的問題來表達我的原創意思。我曾錯誤地寫了structclass,大約混亂:)對不起@Johannes

+0

Eonil :我相信,我的答案澄清了你的所有疑慮,特別是標準的引用。 – Nawaz 2011-03-26 14:27:16

+0

你需要決定你的問題是什麼樣的:1)POD類型或2)簡單地使用'{}'初始化(即聚合)的能力。目前還不清楚具體是什麼問題。 – AnT 2011-03-26 14:41:19

+0

@Nawaz感謝您的關心。你的答案是我想要的! – Eonil 2011-03-26 14:44:29

回答

17

POD指通過定義不能具有用戶定義的構造普通老式的數據類型。

POD實際上是一種聚合類型(請參閱下一個引文)。那麼什麼是聚合? C++標準說,在部分第8.5.1節/ 1,

的聚集物是與保護陣列或類 (第9節)沒有用戶聲明的 構造(12.1),無私人或 非靜態數據成員 (第11章),沒有基類(第 10),沒有虛函數(10.3)。

而且從C++標準部§9/ 4說,

[....]甲POD結構是聚合類不具有非靜態數據的 成員類型的非POD結構, 非POD聯合(或這種類型的陣列) 或參考,並具有沒有用戶定義 拷貝賦值運算符沒有 用戶定義的析構函數。類似地, POD聯合是一個聚合的聯盟,這 具有類型 非POD結構,非POD聯合(或 陣列,例如類型)或參考的沒有非靜態數據成員,以及 具有沒有用戶定義的拷貝分配 運算符沒有用戶定義的 析構函數。 POD類是 類,它是POD結構或POD聯合。

由此看來,它也很清楚,POD類/結構/聯合,雖然不能有用戶定義的賦值運算符用戶定義的析構函數也。


然而,還有其他類型的POD。 §3節。9/10說,

運算類型(3.9.1), 枚舉類型,指針類型,和 指針成員類型(3.9.2),以及這些類型的 CV-合格版本(3.9 .3)統稱爲標量 類型。標量類型,POD-結構類型, POD-union類型(第9節), 這種類型的數組和CV-合格版本這些類型的 (3.9.3)是 統稱POD類型

閱讀FAQ:What is a "POD type"?

+0

我明白了!謝謝。 – Eonil 2011-03-26 13:52:35

5

A類是POD,可以這樣

對不起被初始化,這是錯誤的。因爲b是私人的,所以班級不是POD。

但是鏘假定A作爲非聚合類型。爲什麼我不能有這樣的構造函數?還是我應該做點別的?

這是C的限制++,因爲它當前存在。 C++ 0x不再有這個限制。雖然C++ 0x中的類型不是POD要麼,你的初始化就可以了(假設你作出這樣的構造public)。 (另外,我認爲在這裏使用一個更好的術語是「聚合」,使用{ ... }的要求是你的類是一個聚合,它不一定是POD)。

+1

噢,謝謝。這是我使用'class'而不是'struct'的錯誤。對不起。我不關心默認訪問。我更新了我的問題。對於聚合但非POD類型的評論本身是有用的:) – Eonil 2011-03-26 14:22:35

2

其他的答案描述POD規則相當不錯。如果你想獲得一個類似的初始化風格構造的POD可以使用make_風格的功能,例如:

struct A 
{ 
    int i_; 
}; 

A make_A(int i = 0) 
{ 
    A a = { i }; 
    return a; 
} 

現在你可以初始化POD情況下,如:

A a = make_A(); 
相關問題