標準布局類描述了一個標準布局類:
- 沒有非標準布局類(或此型別別的陣列)或參考型別的非靜態資料成員,
- 沒有虛函式,也沒有虛基類,
- 對所有非靜態資料成員具有相同的訪問控制,
- 沒有非標準布局的基類,
- 具有該類及其基類中的所有非靜態資料成員和位欄位,并首先在同一類中宣告,并且
- 給定類為 S,沒有型別集合 M(S) 的元素作為基類,其中型別 X 的 M(X) 定義為:
- 如果 X 是沒有(可能繼承的)非靜態資料成員的非聯合型別別,則集合 M(X) 為空。
- 如果 X 是一個非聯合型別別,其第一個非靜態資料成員的型別為 X0(其中所述成員可以是匿名聯合),則集合 M(X) 由 X0 和 M(X0) 的元素組成。
- 如果 X 是聯合型別,則集合 M(X) 是所有 M(Ui) 和包含所有 Ui 的集合的并集,其中每個 Ui 是 X 的第 i 個非靜態資料成員的型別。
- 如果 X 是元素型別為 Xe 的陣列型別,則集合 M(X) 由 Xe 和 M(Xe) 的元素組成。
- 如果 X 是非類、非陣列型別,則集合 M(X) 為空。
(為方便起見編號)
但是,以下失敗:
#include <type_traits>
struct A {
int a;
};
struct B : A {
int b;
};
static_assert(std::is_standard_layout<A>::value, "not standard layout"); // succeeds
static_assert(std::is_standard_layout<B>::value, "not standard layout"); // fails
Demo
我看到 1-4 是真的,那么低于 5 的點之一是假的嗎?我發現 5 分以下的分數有點令人困惑。
uj5u.com熱心網友回復:
cppreference 描述有點混亂。
標準(搜索“標準布局類是”)說:
標準布局類是這樣的類:
- 沒有非標準布局類(或此型別別的陣列)或參考型別的非靜態資料成員,
- 沒有虛函式 (10.3) 和虛基類 (10.1),
- 對所有非靜態資料成員具有相同的訪問控制(第 11 條),
- 沒有非標準布局的基類,
- 要么在派生最多的類中沒有非靜態資料成員,并且最多有一個具有非靜態資料成員的基類,要么沒有具有非靜態資料成員的基類,并且
- 沒有與第一個非靜態資料成員相同型別的基類。
從我強調的部分可以看出,具有非靜態資料成員的類和本身具有非靜態資料成員的基類不是標準布局。
我懷疑這一點在cppreference中描述如下:
具有該類及其基類中的所有非靜態資料成員和位域,首先在同一類中宣告
關鍵是您必須能夠將標準布局類物件的地址轉換為指向其第一個成員的指標,然后回傳。它歸結為 C 和 C 之間的兼容性。
另請參閱:為什么 C 11 的 POD“標準布局”定義是這樣的?.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/512564.html
標籤:C c 11
