C++ 11 is_pod与GCC 4.6

Cha*_*l72 6 c++ gcc pod c++11

根据C++ 11 中POD宽松定义,我的理解是以下结构被认为是POD:

template <class T>
struct Foo 
{
    Foo()
    { }

    explicit Foo(T* obj) : m_data(obj)
    { }

    T* m_data;
};
Run Code Online (Sandbox Code Playgroud)

但是,使用GCC 4.6并使用-std=c++0x标志进行编译,如果我说:

std::cout << std::boolalpha << std::is_pod<Foo<int>>::value << std::endl;
Run Code Online (Sandbox Code Playgroud)

它输出:

false
Run Code Online (Sandbox Code Playgroud)

这是一个显示完整程序的ideone链接.(注意,ideone使用GCC 4.5)

那么,我对C++ 11中的POD的理解是错误的,还是GCC 4.6在C++ 11合规方面根本不是最新的?

Jam*_*lis 6

POD结构必须是一个简单的类(C++11§9[class]/10):

POD结构是一个非联合类,它既是普通类,也是标准布局类,并且没有非POD结构类型的非静态数据成员,非POD联合(或此类类型的数组).

§9[class]/6定义了一个简单的类:

一个普通的类是一个具有普通默认构造函数的类,并且可以轻易地复制.

§12.1[class.ctor]/5定义了一个简单的默认构造函数.它始于:

如果它不是用户提供的,那么默认构造函数是微不足道的......

默认构造函数Foo<T>是用户提供的,因此非常重要.因此,Foo<int>不是POD.然而,它是标准布局.