什么是抽象 class 没有数据成员的编译器生成的构造函数

What is Compiler Generated constructor for abstract class no data members

我是 运行 静态分析工具,但遇到错误,因为抽象 class 没有数据成员,也没有构造函数。

给定一个没有数据成员的摘要class:

class My_Interface
{
  public:
    virtual void interface_function(void) = 0;
};
  1. 编译器是否生成任何构造函数?
  2. 如果生成一个构造器,它的内容是什么?
  3. 如果生成一个构造函数,会不会被一个构造函数淘汰 优化级别?

静态分析中的规则文档说:
如果你没有在class中编写至少一个构造函数,编译器将 默认为你写一个 public 构造函数。此规则检测您是否 不要声明至少一个构造函数。

规则文档引用了 Scott Meyers,"Effective C++: 55 Specific Ways to Improve your Programs and Design",第三版。

我的理解是编译器不会为上述情况生成构造函数。

编辑 1:
这不是许多构造函数问题的重复,因为:

  1. 这个没有数据成员。
  2. 这不是问是否需要构造函数,而是问会发生什么 当未提供构造函数时。
  3. 这是 C++ 语言。

即使在这种情况下,编译器至少在理论上合成了一个构造函数。即使您无法创建此 class 的实例,构造函数也会在创建派生 class 的过程中被调用(覆盖 interface_function,因此它可以被实例化)。

鉴于这基本上是一个纯接口 class,构造函数可能不会做任何事情,所以大多数编译器可能会优化它(即使你不告诉它优化代码)。

  1. Are any constructors generated by the compiler?

是的。一些。首先,来自 [class.ctor]:

A default constructor for a class X is a constructor of class X that either has no parameters or else each parameter that is not a function parameter pack has a default argument. If there is no user-declared constructor for class X, a non-explicit constructor having no parameters is implicitly declared as defaulted (8.4). An implicitly-declared default constructor is an inline public member of its class. A defaulted default constructor for class X is defined as deleted if:

后面有几个要点,其中 none 适用。所以我们有相当于:

My_Interface() = default;

然后,来自[class.copy]:

If the class definition does not explicitly declare a copy constructor, a non-explicit one is declared implicitly. If the class definition declares a move constructor or move assignment operator, the implicitly declared copy constructor is defined as deleted; otherwise, it is defined as defaulted (8.4).

所以我们有:

My_Interface(const My_Interface&) = default;

还有:

If the definition of a class X does not explicitly declare a move constructor, a non-explicit one will be implicitly declared as defaulted if and only if
(9.1) — X does not have a user-declared copy constructor,
(9.2) — X does not have a user-declared copy assignment operator,
(9.3) — X does not have a user-declared move assignment operator, and
(9.4) — X does not have a user-declared destructor.

所以我们还有:

My_Interface(My_Interface&& ) = default;
  1. If a constructor is generated, what would it's content be?

三个都生成了,三个都= default;

  1. If a constructor is generated, would it be eliminated by an optimization level?
三个构造函数中的

None 是微不足道的 因为 My_Interface 有一个虚函数。因此,至少,vtable 需要是 initialized/copied。所以 某些事情 将不得不发生,即使 initialize/copy/move 没有任何成员。

Q1。编译器是否生成任何构造函数?

答:是的。来自 C++11 标准:

12.1 Constructors

5 A default constructor for a class X is a constructor of class X that can be called without an argument. If there is no user-declared constructor for class X, a constructor having no parameters is implicitly declared as defaulted (8.4). An implicitly-declared default constructor is an inline public member of its class.

我没有在标准中看到任何可以回答其他两个问题的内容。但是,在您的情况下,由于存在 virtual 成员函数,默认构造函数必须至少设置对象的虚拟 table。