Eon*_*nil 17 c++ constructor pod
我有一个类和一个const变量.
struct A
{
int b;
};
A const a;
Run Code Online (Sandbox Code Playgroud)
该类A是POD,可以像这样初始化.
A const a = { 3 };
Run Code Online (Sandbox Code Playgroud)
恕我直言,有这样的构造函数看起来很好.
struct A
{
int b;
A(int newB) : b(newB)
{
}
};
Run Code Online (Sandbox Code Playgroud)
但Clang假定A为非聚合类型.为什么我不能有这样的构造函数?或者我应该做些什么?
我修改了问题来表达我原来的意思.我已经写了struct为class错误,并抱歉@Johannes约困惑:)
Naw*_*waz 18
POD 表示Plain Old Data类型,根据定义,它不能具有用户定义的构造函数.
POD实际上是一种聚合类型(参见下一个引用).什么是聚合?C++标准在第8.5.1/1节中说明,
聚合是一个数组或类(第9节),没有用户声明的构造函数(12.1),没有私有或受保护的非静态数据成员(第11节),没有基类(第10节),没有虚函数(10.3).
C++标准中的第9/4节说,
[....] POD-struct是一个聚合类,它没有非POD-struct类型的非静态数据成员,非POD-union(或这类类型的数组)或引用,并且没有用户 -定义的复制赋值运算符,没有用户定义的析构函数.类似地,POD-union是一个聚合联合,它没有非POD结构类型的非静态数据成员,非POD联合(或此类类型的数组)或引用,并且没有用户定义的副本赋值运算符并且没有用户定义的析构函数.POD类是POD结构或POD结合的类.
由此,它也清楚POD类/ struct/union虽然也没有用户定义的赋值运算符和用户定义的析构函数.
然而,还有其他类型的POD.§3.9/ 10节说,
算术类型(3.9.1),枚举类型,指针类型和指向成员类型的指针(3.9.2)以及这些类型的cv限定版本(3.9.3)统称为标量类型.标量类型,POD结构类型,POD联合类型(第9节),此类型的数组和这些类型的cv限定版本(3.9.3)统称为POD类型.
阅读此常见问题解答:什么是"POD类型"?
A类是POD,可以像这样初始化
对不起,那是错的.因为b是私人的,所以班级不是POD.
但Clang认为A是非聚合类型.为什么我不能有这样的构造函数?或者我应该做些什么?
这是目前存在的C++限制.C++ 0x将不再具有此限制.在C++ 0x中,您的类型也不是POD,您的初始化将起作用(假设您创建该构造函数public).
(另外,我认为你在这里使用的一个更好的术语是"聚合".使用的要求{ ... }是你的类是一个聚合.它不一定是POD).