2013-02-19 34 views
7

następujący kodPOD w 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); 

daje następujące wyniki: co jest dziwne!

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

W jaki sposób POD_Child to nie POD ?! a POD_Child2 to POD? !!

Zauważ, że skompilowałem go używając MinGW (używając opcji -std = C++ 11) i powiedziałem, że wszystkie z nich to POD.

+0

Niestety nie widzę POD_Child jako członek POD_Child2, usunąłem odpowiedź, ponieważ nie była poprawna :) –

+1

[Rzeczy zmieniły się (całkiem sporo) od 2008 r.] (http://stackoverflow.com/questions/4178175/what-are-aggregates-and-pods -and-how-why-are-them-special/7189821 # 7189821), a stary kompilator prawdopodobnie źle to zrozumiał. –

+0

Otrzymuję taki sam wynik w VC2010, jak w 2008 roku. – user93353

Odpowiedz

0

Według [MSDN][1] typ, który ma klasy bazowej nie jest POD tak POD_Child nie jest POD ale POD_Child2 jej ewentualnie jakiś błąd kompilatora, że ​​ignorowanie klasy podstawowej z ssd

Powiązane problemy