簡體   English   中英

C ++中標准布局類的定義14

[英]Definition of standard-layout class in C++14

標准布局類在C ++ 14的[class] / 7中定義,如下所示(重點是我的):

標准布局類是一個類:

  • (7.1) - 沒有類型為非標准布局類(或此類類型的數組)或引用的非靜態數據成員,
  • (7.2) - 沒有虛函數(10.3),沒有虛基類(10.1),
  • (7.3) - 對所有非靜態數據成員具有相同的訪問控制(第11條),
  • (7.4) - 沒有非標准布局基類,
  • (7.5) - 在大多數派生類中沒有非靜態數據成員, 並且最多只有一個具有非靜態數據成員的基類,或者沒有具有非靜態數據成員的基類,並且
  • (7.6) - 沒有與第一個非靜態數據成員相同類型的基類。

我關注的是bullet(7.5):如何在最派生的類中沒有非靜態數據成員,同時有一個基類具有非靜態數據成員?

換句話說,不是基類的非靜態數據成員,也是最派生類的非靜態數據成員?

是的,這是C ++ 14中的一個缺陷,特別是CWG 1813 雖然可以通過讀取“非靜態數據成員”來僅修復直接 (非繼承)非靜態數據成員(在其他地方可能是必要的)來修復它,但所選擇的修復方法是替換您發現的有問題的語言。下列:

標准布局類是一個類:[...]

  • 該類中的所有非靜態數據成員和位字段及其基類首先在同一個類中聲明,[...]

為了做到這一點,這有點棘手; 盡管[class.derived]具有以下內容,但對將繼承成員視為派生類成員的想法存在一些阻力:

[...]除非在派生類中重新聲明,否則基類的成員也被視為派生類的成員。 除了構造函數之外的基類的成員被稱為由派生類繼承 [...]

盡管如此,許多直接和繼承的非靜態數據成員都被認為是專門調用繼承數據成員的地方,例如也在[類]中 (在CWG 1672的決議之后):

8.6 - 聚合或聯合類型,包括其元素或非靜態數據成員中的上述類型之一(遞歸地,包括子聚合或包含聯合的元素或非靜態數據成員),

或者在[basic.lval]中

7.8 - 如果X是非聯合類類型,如果X沒有(可能是繼承的(第10條))非靜態數據成員,則集合M(X)為空; [...]

同時,在許多地方,“成員”必須被解讀為僅指直接成員才有意義; 首先,只查看非靜態數據成員(不是成員函數),[expr.rel] /3.2,[expr.const] /5.1, [dcl.constexpr] /4.6, [class.mem] / 17, / 19,[special] / 5,[class.ctor] /4.3,/4.4,/ 4.10,/ 4.12,[class.dtor] /5.6, [class.base.init] / 2,/ 13.3,[class。復制] /12.2,/ 12.4,/ 18.2,/ 25.2,/ 25.4,/ 26.3,/ 27,[except.spec] /15.1.1.1,/15.2,/15.3是“非靜態數據成員”可以使用的所有地方或者應該有“直接”前綴。

另一方面,在某些地方(例如在修訂的[class]或[class.copy] /23.2-23.3,/ 28)中,“成員”被隱含地包含在繼承成員中,所以它有點混亂。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM