2016-12-07 49 views
0

我只是用G ++打過來,我發現爲什麼有多個公共訪問說明符standard_layout的類?

#include <type_traits> 

class Foo { 
public: int x; 
public: char y; 
public: double z; 
}; 

static_assert(std::is_standard_layout<Foo>::value, "Foo is not standard layout"); 

int main() {} 

編譯就好了。

根據this答案,data members across access specifiers may be reordered in memory。因此,x實際上是Foo的第一個成員,但實際上在內存中不存在任何亮點。我定義的方式Foo,y實際上可能是第一個元素嗎?

我認爲標準的佈局意味着你可以或多或少地理解字節是如何佈局給定的類型的。允許標準佈局類型中的字段以任意方式重新排序似乎對我來說是違反直覺的。爲什麼這是允許的?

+0

'Foo'可能不是標準佈局並不意味着'Foo' _must not_不是標準佈局。即不同版本的編譯器可能選擇在靜態斷言上失敗。但如果它編譯,你就知道它必須是標準佈局。 –

回答

3

結構的所有成員都具有相同的訪問說明符:public。關鍵字出現在每個班級成員之前的事實並不重要。這相當於在所有班級成員之前出現一次的public訪問說明符。

+0

那麼我鏈接的答案是不正確的?因爲這個答案表明有一個'公開''訪問說明符出現不止一次確實有一些語義上的區別 – math4tots

+0

通過「答我鏈接」我的意思是這一個:http://stackoverflow.com/questions/11362543/using-same-c -access-specifiers-mulitple-times/11364029#11364029 – math4tots

+0

@ math4tots它看起來像我的答案是錯誤的。從草案n3797 9.2 p13:*具有相同訪問控制(第11章)的(非工會)類的非靜態數據成員被分配,以便後面的成員在類對象內具有更高的地址*因此即使私有,受保護和公開一個類型的所有對象都沒有相互的命令,並且彼此之間的命令是絕對的。 – NathanOliver

相關問題