为什么具有已删除的复制构造函数的结构不是POD类型?

Chu*_*huu 9 c++ struct copy-constructor c++14

我们有以下方法来测试我们的结构是否是POD.它总是返回true:

bool podTest() {
  struct podTest {
    int count;
    int x[];
  };

  return std::is_pod<podTest>::value;  //Always returns true
}
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.现在我们进行一次更改并删除复制构造函数:

bool podTest() {
  struct podTest {
    podTest(const podTest&) = delete;
    int count;
    int x[];
  };

  return std::is_pod<podTest>::value;  //Always returns false
}
Run Code Online (Sandbox Code Playgroud)

这总是返回false.在阅读了is_pod我的定义后,我仍在努力了解它违反了什么要求.我错过了什么?

这是使用gcc 6.1在godbolt上编译的 -std=c++14

Bar*_*rry 9

啊哈!

来自[班级]:

POD结构是一个非联合类,既是普通类,也是标准布局类

一个简单的类是:

一个普通的类是一个可以轻易复制的类,它有一个或多个默认构造函数(12.1),所有这些都是微不足道的或被删除的,并且至少有一个不被删除.

但是在[class.copy]中:

如果没有用户声明的类X构造函数,则不会将没有参数的非显式构造函数隐式声明为defaultaulted(8.4).

podTest,当你明确地删除拷贝构造函数,没有默认构造函数.所以这不是一个微不足道的课程,所以它不是POD.如果你加入:

podTest() = default;
Run Code Online (Sandbox Code Playgroud)

然后它将再次成为POD.