C ++ 11 is_pod与GCC 4.6

时间:2013-01-27 02:57:23

标签: c++ gcc c++11 pod

在C ++ 11中的relaxed definition of POD下,我理解以下结构被视为POD:

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

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

    T* m_data;
};

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

std::cout << std::boolalpha << std::is_pod<Foo<int>>::value << std::endl;

输出:

false

这是显示完整程序的ideone link。 (注意,ideone使用GCC 4.5)

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

2 个答案:

答案 0 :(得分:6)

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

  

一个POD结构是一个非工会类既是琐碎类和一个标准布局类,和具有类型的非POD结构,非POD联合(或这些类型的阵列中的非静态数据成员)。

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

  

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

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

  

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

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

答案 1 :(得分:2)

默认声明默认构造函数,使Foo成为POD。 即。

Foo() = default;
explicit Foo(T* obj) : m_data(obj)
{ }

http://ideone.com/vJltmA