3 回答

TA貢獻1820條經驗 獲得超10個贊
C ++ 14改變了什么
我們可以參考Draft C ++ 14標準以供參考。
骨料
8.5.1
聚合部分對此進行了介紹,它給出了以下定義:
聚合是一個數組或類(第9條),沒有用戶提供的構造函數(12.1),沒有私有或受保護的非靜態數據成員(第11條),沒有基類(第10條),沒有虛函數(10.3) )。
唯一的變化是現在添加類內成員初始值設定項不會使類成為非聚合。因此,以下來自C ++ 11的示例聚合了具有成員in-pace initializers的類的初始化:
struct A{ int a = 3; int b = 3;};
它不是C ++ 11中的聚合,而是C ++ 14中的聚合。N3605中包含此更改:成員初始值設定項和聚合,具有以下摘要:
Bjarne Stroustrup和Richard Smith提出了一個關于聚合初始化和成員初始化器無法協同工作的問題。本文提出通過采用史密斯提出的措辭來解決這個問題,該措辭消除了聚合不能擁有成員初始化者的限制。
POD保持不變
POD(普通舊數據)結構的定義在9
類Classes中介紹,它們說:
POD結構110是非聯合類,它既是普通類又是標準布局類,并且沒有非POD結構類型的非靜態數據成員,非POD聯合(或這種類型的數組)。類似地,POD聯合是一個簡單類和標準布局類的聯合,并且沒有非POD結構類型的非靜態數據成員,非POD聯合(或這種類型的數組)。POD類是POD結構或POD聯合的類。
這與C ++ 11的措辭相同。
C ++的標準布局更改14
正如評論中所指出的,pod依賴于標準布局的定義,并且對于C ++ 14確實有所改變,但這是通過在事實之后應用于C ++ 14的缺陷報告實現的。
有三個DR:
所以標準布局來自這個Pre C ++ 14:
標準布局類是一個類:
(7.1)沒有非標準布局類(或這類類型的數組)或引用類型的非靜態數據成員,
(7.2)沒有虛函數([class.virtual]),沒有虛基類([class.mi]),
(7.3)對所有非靜態數據成員具有相同的訪問控制(Clause [class.access]),
(7.4)沒有非標準布局基類,
(7.5)在大多數派生類中沒有非靜態數據成員,并且最多只有一個具有非靜態數據成員的基類,或者沒有具有非靜態數據成員的基類,并且
(7.6)沒有與第一個非靜態數據成員相同類型的基類
為了在C ++ 14:
類S是標準布局類,如果它:
(3.1)沒有非標準布局類(或這類類型的數組)或引用的非靜態數據成員,
(3.2)沒有虛函數,也沒有虛基類,
(3.3)對所有非靜態數據成員具有相同的訪問控制,
(3.4)沒有非標準布局基類,
(3.5)最多有一個任何給定類型的基類子對象,
(3.6)該類中的所有非靜態數據成員和位字段及其基類首先在同一個類中聲明,并且
(3.7)沒有集合M(S)類型的元素作為基類,其中對于任何類型X,M(X)定義如下.104 [注意:M(X)是類型的集合在X中可能處于零偏移的所有非基類子對象。 - 結束注釋]
(3.7.1)如果X是非聯合類類型,沒有(可能是繼承的)非靜態數據成員,則集合M(X)為空。
(3.7.2)如果X是非聯合類類型,其類型為X0的非靜態數據成員,其大小為零或者是X的第一個非靜態數據成員(其中所述成員可能是匿名聯合),集合M(X)由X0和M(X0)的元素組成。
(3.7.3)如果X是聯合類型,則集合M(X)是所有M(Ui)和包含所有Ui的集合的并集,其中每個Ui是X的第i個非靜態數據成員的類型。 。
(3.7.4)如果X是元素類型為Xe的數組類型,則集合M(X)由Xe和M(Xe)的元素組成。
(3.7.5)如果X是非類非數組類型,則集合M(X)為空。
- 3 回答
- 0 關注
- 597 瀏覽
添加回答
舉報