2013-02-19 151 views
7

下面的代碼POD在Visual Studio 2008

#include <iostream> 
#include <new> 
#include <cstring> 
#include <type_traits> 

template<typename T> 
void is_pod(char* c) 
{ 
    cout << "Type " << c; 
    if(std::is_pod<T>::value) 
     ::std::cout << " is POD" << endl; 
    else 
     ::std::cout << " is not!" << endl; 
} 

#define CHECK_TYPE(ty) ::is_pod<ty>(#ty) 

struct POD_Parent{}; 
struct POD_Child : public POD_Parent{int y;}; 
struct POD_Child2 {int x; POD_Parent y; POD_Child ssd;}; 

int main() 
{ 
    CHECK_TYPE(POD_Parent); 
    CHECK_TYPE(POD_Child); 
    CHECK_TYPE(POD_Child2); 

得出以下結果:這是奇怪!

Type POD_Parent is POD 
Type POD_Child is not! 
Type POD_Child2 is POD 

POD_Child如何不是POD?和POD_Child2是POD?!!

請注意,我使用MinGW編譯它(使用選項-std = C++ 11)並且它表示它們都是POD。

+0

對不起,我沒有看到POD_Child作爲POD_Child2的成員,我刪除了答案,因爲它是不正確的:) – 2013-02-19 16:39:21

+1

[自2008年以來事情發生了變化(相當多)](http://stackoverflow.com/questions/4178175/what-are-aggregates-and-pods以及如何爲什麼是他們特別/ 7189821#7189821),而舊的編譯器可能只是錯了。 – 2013-02-19 16:47:43

+0

我在VC2010中得到了與2008年相同的結果。 – user93353 2013-02-19 16:54:28

回答

0

根據[MSDN][1]具有基礎類的類型不是POD所以POD_ChildPODPOD_Child2它可能是一些編譯器的錯誤,忽略基類的ssd