根据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合规方面根本不是最新的?
POD结构必须是一个简单的类(C++11§9[class]/10):
POD结构是一个非联合类,它既是普通类,也是标准布局类,并且没有非POD结构类型的非静态数据成员,非POD联合(或此类类型的数组).
§9[class]/6定义了一个简单的类:
一个普通的类是一个具有普通默认构造函数的类,并且可以轻易地复制.
§12.1[class.ctor]/5定义了一个简单的默认构造函数.它始于:
如果它不是用户提供的,那么默认构造函数是微不足道的......
默认构造函数Foo<T>是用户提供的,因此非常重要.因此,Foo<int>不是POD.然而,它是标准布局.
| 归档时间: |
|
| 查看次数: |
751 次 |
| 最近记录: |