2013-02-19 54 views
7

Mã sauPOD trong 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); 

Cung cấp cho kết quả như sau: Đó là kỳ lạ!

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

POD_Child có thể không phải là POD ?! và POD_Child2 là POD? !!

Lưu ý rằng tôi đã biên dịch nó bằng cách sử dụng MinGW (sử dụng tùy chọn -std = C++ 11) và nó nói rằng tất cả chúng đều là POD.

+0

xin lỗi tôi không thấy POD_Child như một thành viên của POD_Child2, tôi đã xóa câu trả lời vì nó không đúng :) –

+1

[Mọi thứ đã thay đổi (khá một chút) kể từ năm 2008] (http://stackoverflow.com/questions/4178175/what-are-aggregates-and-pods -and-how-why-are-them-special/7189821 # 7189821), và trình biên dịch cũ có lẽ đã sai. –

+0

Tôi nhận được kết quả tương tự trong VC2010 khi bạn nhận được trong năm 2008. – user93353

Trả lời

0

Theo [MSDN][1] một loại mà có một lớp cơ sở không phải là POD nên POD_Child không phải là POD nhưng đối với POD_Child2 của nó có thể là một số sai lầm của trình biên dịch mà bỏ qua lớp cơ sở của ssd

Các vấn đề liên quan