在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合规方面根本不是最新的?
答案 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)
{ }