7

在C++11 中对 POD 的宽松定义下,我的理解是以下结构被视为 POD:

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

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

    T* m_data;
};

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

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

它输出:

false

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

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

4

2 回答 2

6

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

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

§9[class]/6 定义了平凡的类是什么:

平凡类是具有平凡默认构造函数并且可以平凡复制的类。

§12.1[class.ctor]/5 定义了一个平凡的默认构造函数是什么。它始于:

如果默认构造函数不是用户提供的并且......

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

于 2013-01-27T03:24:38.563 回答
2

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

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

http://ideone.com/vJltmA

于 2013-01-27T08:37:27.880 回答