C++ POD类型不能有任何构造函数吗?

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为非聚合类型.为什么我不能有这样的构造函数?或者我应该做些什么?


我修改了问题来表达我原来的意思.我已经写了structclass错误,并抱歉@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类型"?


Joh*_*itb 5

A类是POD,可以像这样初始化

对不起,那是错的.因为b是私人的,所以班级不是POD.

但Clang认为A是非聚合类型.为什么我不能有这样的构造函数?或者我应该做些什么?

这是目前存在的C++限制.C++ 0x将不再具有此限制.在C++ 0x中,您的类型也不是POD,您的初始化将起作用(假设您创建该构造函数public).

(另外,我认为你在这里使用的一个更好的术语是"聚合".使用的要求{ ... }是你的类是一个聚合.它不一定是POD).