2016-04-01 22 views
23

執行以下代碼:爲什麼具有引用的類不符合standard_layout?

#include <iostream> 
#include <type_traits> 

struct s_ref { 
    int &foo; 
}; 

struct s_ptr { 
    int *foo; 
}; 

int main(int argc, char *argv[]) 
{ 
    std::cout << "s_ref is_standard_layout:" << std::is_standard_layout<struct s_ref>::value << std::endl; 
    std::cout << "s_ptr is_standard_layout:" << std::is_standard_layout<struct s_ptr>::value << std::endl; 
    return 0; 
} 

結果:

s_ref is_standard_layout:0 
s_ptr is_standard_layout:1 

基於標準佈局的用途(即:「標準佈局類型是寫在其他編程語言代碼進行通信的」 )這是有道理的,但我不確定哪個是違規的規則:

標準佈局類是一個類(用類,結構或定義工會)認爲:

  • 沒有虛擬功能和沒有虛擬基類。

  • 對於其所有非靜態數據成員具有相同的訪問控制(私有,受保護,公共)。

  • 要麼在派生類最多,要麼最多隻有一個具有非靜態數據成員的基類中有非靜態數據成員,或者沒有帶有非靜態數據成員的 基類。

  • 它的基類(如果有的話)本身也是標準佈局類。

  • 而且,沒有與其第一個非靜態數據 成員相同類型的基類。

編輯:報價是:http://www.cplusplus.com/reference/type_traits/is_standard_layout/,但http://en.cppreference.com/w/cpp/concept/StandardLayoutType也是類似的。

+0

很酷的問題! :) – erip

+0

什麼是您的報價來源? –

+3

@ Cheersandhth.-Alf很可能[cplusplus.com](http://www.cplusplus.com/reference/type_traits/is_standard_layout/)。 – Holt

回答

23

一個標準佈局類的C++標準的概念的一點是,這樣的類的實例可以作爲可靠地訪問或複製爲字節,其中,因爲在其§9/ 9,使得這種類

用於與寫在其它編程語言代碼通信中有用的C++ 11標準筆記

但是,C++標準根本不需要使用存儲的參考。這不是一個對象。你不能接受它的地址。所以它不能(可靠地)複製到字節,或者以字節的形式訪問。因此它與標準佈局類的概念不兼容。

在正規,

C++ 11§9/ 7:

標準佈局類是一個類:
- 不具有非靜態非標準佈局類型的數據成員(或這種類型的數組)或參考,

+5

我認爲這個答案比接受的答案要好,因爲它實際上解釋了理由,而不僅僅是糾正引用。 –

11

在n4140中,您可以閱讀:

9類(7。1)

標準佈局類是一類:

  • 具有類型非標準佈局類的沒有非靜態數據成員(或這種類型的陣列)或參考

[編輯]

爲爲什麼與引用類是不標準的進一步信息版面閱讀本外觀極好答案:C++ Standard Layout and References

12

我不知道w在這裏你從中得到了這個引用,但是它忽略了標準中的相關規則。

(N3337) [class]/7:的標準佈局類是一類:

- 具有型非標準佈局類(或這些類型的陣列)或參考的沒有非靜態數據成員,

- 沒有虛函數(10.3),沒有虛擬基類(10。1),

- 具有相同的訪問控制(第11)的所有非靜態數據成員,

- 已沒有非標準佈局基類,

- 要麼沒有非靜態數據成員在派生類最多,最多隻有一個基類,其中包含非靜態數據成員 ,或者沒有包含非靜態數據成員的基類,並且不包含具有非靜態數據成員的基類,並且

和 和

。第一個非靜態數據成員.108

相關問題