以下代码
#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.
解决方法
根据[MSDN] [1],具有基类的类型不是POD所以POD_Child不是POD但是对于POD_Child2它可能是编译器忽略ssd基类的一些错误