2011-08-18 110 views
2

第二類不是標準佈局的原因是什麼? (Visual Studio的C++)標準佈局和繼承

#include <iostream> 
#include <type_traits> 

struct A 
{ 
    int i; 
}; 

struct B : public A 
{ 
}; 

std::cout << "is_standard_layout<B> == " 
      << std::boolalpha 
      << std::is_standard_layout<B>::value // gives false 
      << std::endl; 
+0

看來Visual Studio 10不支持像is_standard_layout這樣的類。 GCC 4.6工作。 – mazatwork

+0

std :: is_standard_layout <>應該做什麼?我還沒有找到有關此功能的非常多文檔。 –

+0

@Stephane:這是一個metamethod,它返回一個類是否是標準佈局。 [Wikipedia article](http://en.wikipedia.org/wiki/C%2B%2B0x#Modification_to_the_definition_of_plain_old_data)對這意味着什麼進行了徹底的討論。 –

回答

1

Accorting到this MSVC支持自8版本內置型特徵,但this似乎是說,你需要版本11

9.7定義了一個標準的佈局類作爲類:

  • 具有類型非標準佈局類(或這些類型的陣列)或參考,沒有非靜態數據成員
  • 沒有虛函數(10.3),並且沒有虛基類(10.1),
  • 具有用於所有非靜態數據成員相同的訪問控制(第11),
  • 沒有非標準佈局基類,
  • 或者在派生類最多,最多一個基類中有非靜態數據成員,或者沒有包含非靜態數據成員的基類,並且
  • 沒有基類與第一個非靜態數據成員類型相同。

some explanation here