3 回答

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